题目
A+B Format (20)
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).Input
Each input file contains one test case. Each case contains a pair of integers a and b where -1000000 <= a, b <= 1000000. The numbers are separated by a space.
Output
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
Sample Input
-1000000 9
Sample Output
-999,991
题目要求将输入的两数之和(sum)以从右往左数起每三位加一个逗号的格式输出。
解题思路
理解题目意思之后,我的第一个思路是想利用数组,通过像填格子一样,将sum的每一位数分别填入一个数组之中,然后再将逗号按格式要求填入,后来觉得输出的时候用一个变量来记录输出的数字个数再直接输出逗号,而不将逗号填入数组之中会更简单一点。但是这个思路在打代码的时候遇到了一点小困难,我不知道怎么用简单的方法将sum的每一个位数填入数组之中。然后我有了第二个思路,既然是三位数字加上一个逗号,那只要将从右至左的每组三位数字看成一个整体提取出来就好了。
编码与提交修改过程
根据第二个思路我写出了第一个版本:
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,sum;
scanf("%d%d",&a,&b);
sum=a+b;
c=sum/1000000;
d=sum/1000;
if(c==0&&d==0)
printf("%d",sum);
if(c==0&&d!=0)
{
e=sum/1000;
f=sum%1000;
if(sum<0)
printf("-%d,%d",e,f);
else
printf("%d,%d",e,f);
}
if(c!=0)
{
e=(sum-c*1000000)/1000;
f=(sum-c*1000000)%1000;
if(sum<0)
printf("-%d,%d,%d",c,e,f);
else
printf("%d,%d,%d",c,e,f);
}
return 0;
}
自己用几组正数数据检验得出正确结论后就把代码提交了,但是得到的结果是:
检查之后发现当sum为负数时,输出的结果会有错误,比如:
于是对sum是负数的情况的输出格式做了一点修改,将两处
if(sum<0)
printf("-%d,%d",e,f);
改为
if(sum<0)
printf("%d,%d",e,-f);
在代入几组负数检验之后再次提交,结果还是不对,再次检查之后发现还是输出格式上的问题,如:
于是再对输出进行了修改,补上了“%03d”,
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,sum;
scanf("%d%d",&a,&b);
sum=a+b;
c=sum/1000000;
d=sum/1000;
if(c==0&&d==0)
printf("%d",sum);
if(c==0&&d!=0)
{
e=sum/1000;
f=sum%1000;
if(sum<0)
printf("%d,%03d",e,-f);
else
printf("%d,%03d",e,f);
}
if(c!=0)
{
e=(sum-c*1000000)/1000;
f=(sum-c*1000000)%1000;
if(sum<0)
printf("%d,%03d,%03d",c,-e,-f);
else
printf("%d,%03d,%03d",c,e,f);
}
return 0;
}
检验后提交得到了正确结果:
之后觉得a,b,c之类的字母使用的有点多,好像不太直观,整个代码有点繁琐杂乱,于是就把它精简了一下:
#include<stdio.h>
int main()
{
int a,b,sum;
scanf("%d%d",&a,&b);
sum=a+b;
if(sum<0)
{
printf("-");
sum=-sum;
}
if(sum<1000)
printf("%d",sum);
if(999<sum&&sum<1000000)
printf("%d,%03d",sum/1000,sum%1000);
if(999999<sum&&sum<100000000)
printf("%d,%03d,%03d",sum/1000000,(sum%1000000)/1000,sum%1000);
return 0;
}
提交后的结果是正确的。
在写完第二个思路的代码之后,想到了如何将sum的每位数分别存入一个数组之中,于是又按照第一个思路写了一个运用到数组的代码:
#include<stdio.h>
int main()
{
int a,b,sum,i,j,t,arr[12];
scanf("%d%d",&a,&b);
sum=a+b;
if(sum<0)
{
printf("-");
sum=-sum;
}
for(i=1;sum>=10;i++)
{
arr[i]=sum%10;
sum=sum/10;
t=i;
}
arr[t+1]=sum;
//将sum逆序存入数组arr中
for(i=1,j=t+1;i<=t+1;i++,j--)
{
printf("%d",arr[j]);
if((t+1-i)%3==0&&(t+1-i)!=0)
printf(",");
}
return 0;
}
提交记录
感觉自己这篇随笔写得有点繁琐了,但这是我坎坷的心路历程啊。做完这题之后,觉得自己以后在编码的时候还是要细心一点,之前果然是立flag,拖延的毛病还是没改,作业还是很晚才完成,惭愧。