一开始看题目的时候有点没看懂,要求把数分组是什么意思。如果只是单纯的a+b的话是不可能的,所以关于这一点犹豫了很久。本来以为是指把a,b,以及它们的和c各建一个数组,但只输入一次的话,建数组根本没意义。后来才终反应过来,是指每三位用逗号隔开。
于是就先尝试将a和b相加后的值,取除1000后的余数,依次存入一个数组中,然后再按顺序输出。
输入1000000和9,跳出来的是“9,1,0,9”。看起来非常的有问题。
把原先的“%d”改为“%03d”后,输出变成“009,001,000,009”了。从结果来看应该是多循环了一次。
于是就改了改循环,修改后显示的是“001,000,009”。
要把第一组的0去掉,于是重新讨论分类。
终于正常了,现在是“1,000,009”。
但是突然发现自己忘记考虑负数了。
尝试带入-1000000和-9,得出的是“-1,000,-09”。看来除了第一部分,其余都不用保留符号。
再在原代码上改下去的话会越来越复杂,就决定重新开始。
这次把-1000~1000之间的数先单独提出来,这是可以直接输出的。
因为除了第一部分其他都不需要符号,所以引入abs函数。
意识到数字范围在-1000000~1000000之间,也就是说最多不超过三组,既然之前的数组用起来太费劲,那这次就直接按大小分好了。
一共分成了绝对值小于1000,小于1000000,大于1000000三组。
因为最多也只有两个逗号,所以直接用i,j,r来代表三块的数字。
输入-1000000和-9,这回是“-1,000,009”了。
又输入32和-32,得出“0”。
输入-10000和81,得出“-9,919”。
似乎没有问题了,去提交代码。
但是代码提交后,却显示返回非零。非常困扰。
原来是编译器选错了。
改成C后提交就好啦。
这是代码。
提交列表。
因为学长提出了把abs放在前面,所以也就做了尝试。但究竟是否有提高代码效率没有看出来……这该怎么看呢?
当初没有把abs放在前面是因为想当然的觉得如果先设了绝对值,后面每次输出时就都得重新讨论正负。但这次想了想后,觉得既然已经用了直接分三类讨论这种偏投机取巧的方法,那不妨更干脆点,直接在开头就判断正负,如果是负数,就直接先输出一个负号。
原先的代码是很久以前打的了,导致当时随手设的变量名现在看得晕乎乎的,所以这次是重新编了一遍。设置变量名时,三块内容分别用st,nd,rd表示,感觉清楚多了。中途又出现了“%d"中没有加03的错误,还出现了输出时加了&的低级错误,真是很不应该。
编完后又拿去测了测,通过了。
以下是代码。
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,d;
int st,nd,rd;
scanf("%d %d",&a,&b);
c=a+b;
d=abs(c);
if(c<0) printf("-");
if(d<1000) printf("%d",d);
else if(d<1000000)
{
st=d%1000;
nd=d/1000;
printf("%d,%03d",nd,st);
}
else
{
st=d%1000;
d=d/1000;
nd=d%1000;
rd=d/1000;
printf("%d,%03d,%03d",rd,nd,st);
}
return 0;
}
以下是提交列表。