您的位置:首页 > 其它

第二次作业———“A+B Format”思路与总结

2016-01-28 16:39 302 查看

作业链接

GitHub链接: https://github.com/zzy19961112/object-oriented

题目

解题思路:

一开始粗略看这道题,熟悉的A+B题目,读完之后就发现略有不同,输出结果的格式要求跟平常所用的计算器的输出格式一样:每三位用一个逗号隔开。此时出来的解题思路便是把每一位的数字存进数组,每隔三位存进一个逗号最后输出。

代码:

#include<stdio.h>
#include<string.h>
int main()
{
int a,b,temp,sum,i=0;
char arr[2000005];
scanf("%d%d",&a,&b);
sum=a+b;
temp=sum;
sum=(sum>0)?sum:-sum;
while(sum){
if(i==3||i==7){
arr[i]=',';
arr[++i]=sum%10+48;
}
else
arr[i]=sum%10+48;
sum/=10;
i++;
}
strrev(arr);
if(temp<0) {
printf("-");
printf("%s\n",arr);
}
else
printf("%s\n",arr);
return 0;
}

评测结果

编译错误,一开始感觉很奇怪,在本地编译器都能通过,在线测评却连编译都通过不了,看了下错误信息,在23行提示warning,好像是不支持“strrve”函数,所以第二次尝试就用暴力实现数组的反转。

代码:

#include<stdio.h>
#include<string.h>
char arr[2000005],ans[2000005];
int main()
{
int a,b,temp,sum,length,j,i=0;
scanf("%d%d",&a,&b);
sum=a+b;
temp=sum;
sum=(sum>0)?sum:-sum;
while(sum){
if(i==3||i==7){
arr[i]=',';
arr[++i]=sum%10+48;
}
else
arr[i]=sum%10+48;
sum/=10;
i++;
}
length=strlen(arr);
for(i=0,j=length-1;i<length;i++,j--){
ans[i]=arr[j];
}
if(temp<0) {
printf("-");
printf("%s\n",ans);
}
else
printf("%s\n",ans);
return 0;
}

评测结果

这次编译通过却错误了一个点,回看代码查找错误,在while判断中没有考虑到和为'0'的情况。所以在输出部分更改代码

if(temp==0)
printf("0");
else if(temp<0){
printf("-");
printf("%s\n",ans);
}
else
printf("%s\n",ans);

评测结果

成功通过。
但是写这篇博的时候,我突然觉得这种方法好像很麻烦,还动用了数组,理论上在线测评第一题应该不用这么麻烦的,于是我又测试了另一种方法:通过数字的位数来分情况。

代码

#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>=1000000){
printf("%d,%03d,%03d\n",sum/1000000, (sum/1000)%1000, sum%1000);
}
else if(sum >= 1000){
printf("%d,%03d\n",sum/1000,sum%1000);
}
else
printf("%d\n", sum);
return 0;
}

评测结果

总结

1.看到题目多思考,不急于敲,多加思索可能会想到更简便的方法。
2.考虑问题要周全,避免出现不必要的bug。
3.注意数组过大必须放于全局变量,这个点在本地编译运行的时候程序一运行就崩溃,看了好久代码没发现问题,最后才想到是数组过大。(这个要点已经多次错误,定引起重视)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: