目录
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表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
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') {//不能输出1cout << 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;
}