PAT 1001. A+B Format 解题
1001. 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).
解题思路
将a+b的值先存在sum中,再逐个分解sum的数字,将组成sum的所有数字存到数组中,由于题目给出a和b的范围是-1000000及1000000之间,于是数组只用开到7就行,接着是处理输出格式问题,首先判断sum共有几位数,采用从高位往低位遍历寻找第一个不为0的数,该数即为最高位,然后从此为开始往低位输出,输出的时候判断一下需不需要输出“,”,判断依据是下一位位数是否为3的整数倍,是则输出。
调试过程
问题1:数组越界
我的思路是设置一个数组number来保存sum各位上的数字,经分析sum最多只有7位也就是七个数字,所以我不假思索的写上了int number[7];
,这样定义也不是不可以只要接下来从0开始存就可以了,但我又不假思索的从number[1]
开始存到了number[7]
,于是问题就出现了,导致最后一位全错。(其实我事先在DC上编译运行的时候是没问题的,后来提交后才发现了错误,至今没懂为什么自己运行的时候竟然是过得去的。)这个小问题告诉我们,细心非常之重要。
再次划重点:数组下标从0开始
问题2:负号的输出问题
由于第一版代码我把负数的判断放在了最后,所以每输出一个数字就判断一次正负的,最终导致出现了多个负号的情况。于是改进办法就是从一开始就先判断正负,判断完后直接输出负号,再取绝对值进行下面的运算。
问题3:flag忘记初始化
最后一次提交,出现了一个错误,查了帮助提示是数组越界。于是自己看了半天代码,尝试了各种情况后还是没找出是哪一组数据出现了问题,最后经高人指点发现其实就是漏了全为0的情况……这还是一个细节问题。初始化了flag之后就全AC了。
提交记录
后记
虽然作业只是很简单的一道题目,但还是可以从中收获许多经验。这道题带给我的,就是细心的重要性。细节无疑在编程中是不可忽视的部分,也是最容易出错的地方。往往有时过不去就是一个地方的小细节出了错,有时是格式,有时甚至是单词错了,这些问题还好,编译的时候还会提示你,但如果是编译器找不出来的问题那就有点麻烦了。所以说,从现在开始就要养成注意细节的习惯了。
附录(代码)
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,sum,number[8]={0},i,flag=0;
scanf("%d %d",&a,&b);
sum=a+b;
/*处理负号*/
if (sum<0)
{
printf("-");
sum=abs(sum);
}
/*将sum中每个数依次存入数组中*/
for (i=1;i<=7;i++)
{
if (sum!=0)
{
number[i]=sum%10;
sum=sum/10;
}
else break;
}
/*寻找最高位*/
for (i=7;i>0;i--)
{
if (number[i]!=0)
{
flag=i;
break;
}
}
/*依次输出数字*/
for (i=flag;i>0;i--)
{
printf("%d",number[i]);
if ((i>3)&&((i-1)%3==0))
{
printf(",");
}
}
if (flag==0) printf("0"); //处理为0的情况
return 0;
}