《计算机考研复试上机指导全书习题集》试读版
1001. A+B Format (20)
Time Limit: 400 MS Memory Limit: 65536 KB
题意
给出两个整数a、b (不超过10^9),求a+b 的值,并按照xxx,xxx,xxx,xxx 的格式输出。
样例解释
Sample One
-1000000 + 9 = -999991
按照格式输出为-999,991 。
考察点
字符串处理
思路
Step 1
对输入的两个数字a 与b 进行累加,并赋值给sum 。之后判断累加后得到的sum 是否为负数,
如果是负数,则负号先行输出,并令sum = -sum 来取正。
Step2
把sum 的每一位存到数组中 (例如123 存到数组num[]中就是num[0] = 3、num[1] = 2、num[2]
= 1,即sum 的低位存储到num[]的低位),之后从高位开始输出数组元素,每输出3 个数字输出 1
个逗号,最后3 个数字后面不输出。
注意点
Note 1: 把sum 存放到数组时,如果是用while 写的话,就要注意0 这个数据需要特殊处理,否则
while 循环进不去,导致len 会等于0 ;而如果用do while 循环写的话,则可以不用考虑。
//使用while 的写法
int len = 0;
if(sum == 0) num[len++] = 0;
while(sum) {
num[len] = sum % 10;
sum /= 10;
++len;
}
//使用do...while 的写法
= 5 =
int len = 0;
do {
num[len] = sum % 10;
sum /= 10;
++len;
}while(sum);
Note 2: 注意最低位后面是不需要输出逗号的,所以需要在输出逗号时判断是否是最低位。
Note 3: 这题还可以采用下面的写法,不妨拓宽下思路 (省略Step1 的步骤):
在 printf 的格式化输出中,%3d 表示输出三位整数,不满三位的高位补空格;而%03 表示输出三位
整数,不满三位的高位补0 。于是可以得到下面这个简洁的写法,不妨好好理解一下:
if(sum >= 1000000) printf("%d,%03d,%03d", sum/1000000, sum%1000000/1000, sum%1000);
else if(sum >= 1000) printf("%d,%03d", sum/1000, sum%1000);
else printf("%d", sum);
参考代码
#include
int num[10];
int main() {
int a, b, sum;
scanf("%d%d",&a, &b);
sum = a + b; //将a+b 赋值给sum
if(sum < 0) { //sum 为负数时,输出负号并取sum 的相反数
printf("-");
sum = -sum;
}
int len = 0; //len 存放sum 的长度
if(sum == 0) num[len++] = 0; //sum 为0 时特殊处理
while(sum) { //将sum 存入数组num[]中,其中sum 的低位存放到num[]的低位
num[len++] = sum % 10; //将sum 的末位sum%10 存放到num[len],然后len++
sum /= 10; //去除sum 的末位
}