寒假作业2:解题思路
解题思路
Github的链接(https://github.com/MercuialC/object-oriented)
题意理解:
让我来翻一下题目。题目说输入两个数,然后将他们的和用一种规定的格式输出。这种格式也很常见,(取钱的时候见过吧)。(嗯,还是一道很平易近人的题目)
解题的经历:
做这道题,我换了两种思路,(嗯,很明显,第一条我认为比较规范的道路我没走通)
先说说两种思路吧
- 我的第一种思路:先输入两个数然后设个字符型数组,嗯,求和完将这个和的每一个数字分别存入这个数组中的一个元素中,但是每三个就加一个逗号。
代码如下:
int main()
{
int a,b,sum,i,j,d=1000000,e=1,f=0;
char c[20]={0};
scanf("%d%d",&a,&b);
sum=a+b;
for(;;)
{
d=(d/(e));
if(d==0)
{
break;
}
e=e*10;
j=(sum/(d));
if(j!=0)
{
sum=(sum-j*(d));
for(;;)
{
d=(d/(e));
if(d==0)
{
break;
}
e=e*10;
j=(sum/(d));
if(f%3==0&&f!=0)
{
c[f]=',';
f=f+1;
}
c[f]=j;
f=f+1;
sum=(sum-j*(d));
}
}
}
for(i=0;i<f-1;i++)
{
printf("%c",c[i]);
}
return 0;
}
排错时通过不断地输出来检验有没有执行哪一条语句,然后判断前一过程的值有没有问题。
排错图片
嗯,然后我发现写错了,首先是我发现,我的思路都不能实现,输出会出现奇怪的字符。
然后我就发现我想错了
嗯,举个栗子。eg:输入10000 和1。设了c[]这个数组。然后和为10001就c[0]=1,c[1]=0,c[2]=0,c[3]=',',c[4]=0,c[5]=1。(没错,就是这样)
2. 然后我就生气了(2333)我决定用愚蠢实用的方法快速解决它
第二种思路简单粗暴(。。)嗯,我的思路是这样的:首先,a与b有最大值的限制(多好啊)所以他们的和最高(max)有2后面6个0,最低(min)有负2后面6个0!
然后就好像很简单的样子,分情况讨论讨论,如果它大于4位数小于7位数用和来除1000得到的数就是逗号前的,(逗号后有3个0),嗯,然后再分具体几位数来看看到底要补全几个0.然后如果小于4位或等于7位再具体讨论一下(if语句是万能的)
具体代码如下:
int main()
{
int a,b,i,j,k,l,sum;
scanf("%d%d",&a,&b);
sum=a+b;
if(sum<1000&&sum>=0)
{
printf("%d",sum);
}
else if(sum>=1000)
{
i=sum/1000;
j=sum-i*1000;
if(i<1000&&i>=100)
{
printf("%03d,%03d",i,j);
}
else if(i>=10&&i<100)
{
printf("%02d,%03d",i,j);
}
else if(i>=1000)
{
k=i/1000;
l=i-k*1000;
printf("%d,%03d,%03d",k,l,j);
}
else
{
printf("%d,%03d",i,j);
}
}
else if(sum<0)
{
if(sum>-1000)
{
printf("%d",sum);
}
else if(sum<=-1000)
{
i=sum/(-1000);
j=sum*(-1)-i*(1000);
if(i<1000&&i>=100)
{
printf("-%03d,%03d",i,j);
}
else if(i>=10&&i<100)
{
printf("-%02d,%03d",i,j);
}
else if(i>=1000)
{
k=i/1000;
l=i-k*1000;
printf("-%d,%03d,%03d",k,l,j);
}
else
{
printf("-%d,%03d",i,j);
}
}
}
return 0;
}
在调试的途中发现了一些问题,(就是讨论情况中的遗漏,毕竟方法比较笨)一个是一开始默认和也是>=-1000000&&<=1000000;然后比较暴力的处理了七位数的情况。后来发现了这一问题(因为网络当时没有所以修改过程没有截屏)。
总结
嗯,通过第二个思路,总结一种不断除整然后相减取某一位数的常见方式,也发现简单的思路有时候也很重要,然后第一个思路也会去想想完善完善的。附上提交记录
(啊哈哈,第一次,失误失误)