题目链接在此。
思路还是比较简单的,但是需要注意:
举个例子说明正确的记法:9,999(正确) 999,9(错误)
也就是逗号的输出,需要注意。
这一点上,首先要明确输出逗号的位置,输出逗号的位置应该是在从个位开始,每向高位方向输出三个数字之后,输在这第三个数字之前输出一个逗号,也即,从个位起,在位序(从个位的0开始)为3的倍数的后面输出一个逗号。故只需要知道当前位序 i 相对于个位(个位位序为0)的位序K是多少就可以判断何时输出逗号。 得出一个规律:K = num-1-i(num是a+b结果的位数,i从0开始)。这一点很像 PAT-B 1048. 数字加密(20)这个题目中位序奇偶的判断,可以看看,想想。据说姥姥出的题简单直观,但是要拿满分很难,当真如此。
- 最后一个数的后面不输出逗号,例如:999,999,
- 不同的方法以及他们的优劣在代码注释中已经给出
#include<stdio.h>
#include<math.h>
#include<string.h>
int str[110];
int main(){
int a,b;
scanf("%d %d",&a,&b);
int res = a+b;
if(abs(res) < 1000){
printf("%d\n",res);
}else{
if(res<0){
printf("-");
res = -res;
}
//将int型res转换到int型数组str中
int num = 0;
while(res!=0){
str[num++] = res%10;
res /= 10;
}
//翻转str数组
for(int i = 0; i < num/2; i++){ //不能写成i<=num/2
int temp = str[i];
str[i] = str[num-1-i];
str[num-1-i] = temp;
}
// //也可用sprintf代替以上(放到int数组中再翻转过程)
// sprintf(str,"%d",res);
// int num = strlen(str);
//但是记得str数组定义成char型,输出的时候控制格式改为%c
int count = 0;
for(int i = 0 ; i < num; i++){
printf("%d",str[i]);
if( (num-1-i)%3==0 && count<(num-1)/3){ //或者把后面这个条件换成i<num-1
printf(",");
count++;
}
}
//法二:不翻转,直接倒序输出,此时的“,”的输出更好控制
// for(int i = num-1; i >= 0; i--){
// printf("%d",str[i]);
// if(i%3 == 0 && i>0) printf(",");
// }
}
return 0;
}