蓝桥杯算法训练合集九 1.计算税额2.数字统计3.删除字符串中的“*”4.2的次幂表示5.排序

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1.计算税额

2.数字统计

3.删除字符串中的“*”

4.2的次幂表示

5.排序


1.计算税额

问题描述

税务局希望你帮他们编写征税程序该程序的功能是首先输入某公司的年销售额sale和税率rate然后程序将计算出相应的税额tax并把他显示在屏幕上。计算公式是tax=sale*rate结果保留小数点后两位。注出自课本第三章第3题。

输入格式

输入一行包含两个浮点数sale, rate分别表示销售额和税率

输出格式

输出一行包含一个浮点数表示税额tax结果保留小数点后两位。

样例输入

500000 0.1

样例输入

50000.00

示例代码

#include<iostream>
#include<iomanip>
using namespace std;

int main() {
	double sale, rate, tax;
	cin >> sale >> rate;
	tax = sale * rate;
	cout << fixed << setprecision(2) << tax << endl;//保留两位小数输出
	return 0;
}

2.数字统计

问题描述

请统计某个给定范围[L, R]的所有整数中数字2 出现的次数。 比如给定范围[2, 22]数字2 在数2 中出现了1 次在数12 中出现1 次在数20 中出现1 次在数21 中出现1 次在数22 中出现2 次所以数字2 在该范围内一共出现了6次。

输入格式

输入共1 行为两个正整数L 和R之间用一个空格隔开。

输出格式

输出共1 行表示数字2 出现的次数。

样例输入

Sample Input1:
2 22
Sample Input2:
2 100

样例输出

Sample Output1:
6
Sample Output2:
20

数据规模和约定

1 ≤ L ≤ R≤ 10000。

示例代码

#include<iostream>
using namespace std;

int main() {
	int a, b, cnt = 0;
	cin >> a >> b;
	int res = a;
	while (res <= b) {//找每个位置上的数字如果等于2则符合题目要求
		int temp = 1000, temp1 = res;
		while (temp > 0) {
			int c = temp1 / temp;
			temp1 -= c * temp;
			temp /= 10;
			if (c == 2) {
				cnt++;
			}
		}
		res++;
	}
	cout << cnt;
	return 0;
}

3.删除字符串中的“*”

问题描述

主题是“函数定义与调用、前导字符、串中字符册除”等的综合应用。规定输入的字符串中只包含字母和*号。请编写函数将字符串中的前面*号全部删除中间和尾部的*号不删除。 例如若字符串中的内容为******A*BC*DEF*G****删除后字符串中的内容则应当A*BC*DEF*G****。在编写函数时不得使用C语言提供的字符串函数。

样例输入

******A*BC*DEF*G****

样例输出

A*BC*DEF*G****

示例代码

#include<iostream>
using namespace std;

int main() {
	string a;
	cin >> a;
	int len = a.length(), index = 0;
	for (int i = 0; i < len; i++) {
		if (a[i] != '*') {//遇到第一个不等于'*'的字符就要开始输出
			index = i;
			break;
		}
	}
	for (int i = index; i < len; i++) {
		cout << a[i];
	}
	return 0;
}

4.2的次幂表示

问题描述

任何一个正整数都可以用2进制表示例如137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式令次幂高的排在前面可得到如下表达式137=2^7+2^3+2^0
现在约定幂次用括号来表示即a^b表示为ab
此时137可表示为27+23+20
进一步7=2^2+2+2^0 2^1用2表示
3=2+2^0
所以最后137可表示为222+2+20+22+20+20
又如1315=2^10+2^8+2^5+2+1
所以1315最后可表示为
222+20+2+222+20+222+20+2+20

输入格式

正整数1<=n<=20000

输出格式

符合约定的n的02表示在表示中不能有空格

样例输入

137

样例输出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

样例输入

1315

样例输出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

用递归实现会比较简单可以一边递归一边输出

分析

本题要求最后分解成只能由2的2次方、1次方和0次方组成的形式。如果大于这些数的次方则需要进一步递归每一步都是2(      )除了2的1次方是2这个可以放在输出处理掉。

示例代码

#include<iostream>
using namespace std;
int maxi, index, res = 0;
char ans[100];
void fac(int n) {
	if (n == 2) {
		ans[res++] = '2';
	}
	else if (n == 1) {
		ans[res++] = '1';
	}
	else if (n == 0) {
		ans[res++] = '0';
	}
	else {
		while (n != 0) {//把n分解成2的n次方加的形式
			int temp = maxi, temp1 = index;
			while (temp != 0) {
				if (n / temp == 1) {//找到一个
					ans[res++] = '2';
					ans[res++] = '(';
					fac(temp1);
					n -= temp;
					break;
				}
				temp /= 2;
				temp1--;
			}
			if (n == 0) {//如果是最后一个数
				ans[res++] = ')';
			}
			else {
				ans[res++] = ')';
				ans[res++] = '+';
			}
		}
		return;
	}
}
int main() {
	int n;
	cin >> n;
	maxi = 1;
	for (int i = 1;; i++) {//找到小于题目给出的范围的最大的2次方数并且是2的多少次方
		maxi *= 2;
		if (maxi > 20000) {//如果第一次比20000大退一步
			index = i - 1;
			maxi /= 2;
			break;
		}
	}
	fac(n);
	for (int i = 0; i < res; i++) {//如果是1前面的 和后面的  不能输出
		if (ans[i] == '(') {
			if (ans[i + 1] != '1') {
				cout << ans[i];
			}
		}
		else if (ans[i] == ')') {
			if (ans[i - 1] != '1') {
				cout << ans[i];
			}
		}
		else if (ans[i] != '1') {//不能输出1
			cout << ans[i];
		}
	}
	return 0;
}

5.排序

问题描述

编写一个程序输入3个整数然后程序将对这三个整数按照从大到小进行排列。

输入格式

输入只有一行即三个整数中间用空格隔开。

输出格式

输出只有一行即排序后的结果。

样例输入

9 2 30

样例输出

30 9 2

示例代码

#include<iostream>
#include<algorithm>

using namespace std;

int main() {
	int a[3];
	for (int i = 0; i < 3; i++) {
		cin >> a[i];
	}
	sort(a, a + 3);
	for (int i = 2; i >=0; i--) {
		cout << a[i]<<" ";
	}
	return 0;
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6