程序设计第二次作业<1>
面向对象程序设计第二次作业<1>
题目:
<1>第一次尝试
我立马认识到这是典型的a+b题目,这里我注意到了第一个点:-1000000<=a,b<=1000000 但是令我困惑的是,在编写过程中好像并没有什么作用。
代码:
#include<stdio.h>
int main()
{
int a,b,c,m=0,n=0;
scanf("%d %d",&a,&b);
c=a+b;
printf("%d\n",c);
return 0;
}
评测结果:
小结:
第一次审题总是漏洞百出,大概是受之前的题目影响,把前面一大段非常有用的题目提示忽略掉了,这次我找出了题目中非常关键的一点:"that is,the digits must be separated into groups of three by commas(unless there are less than four digits)."
审题粗心和不严谨拿到题目没有认真审题是一件非常令我惋惜的错误。
<2>第二次尝试
有了第一次尝试的教训以后,我注意到题目的要求,并做出了如下改正。
代码 1:
#include<stdio.h>
int main()
{
int a,b,c,m=0,n=0;
scanf("%d %d",&a,&b);
c=a+b;
m=c/1000;
n=c/1000000;
if(m==0&&n==0)
printf("%d\n",c);
else if(m!=0&&n==0)
printf("%d,%d\n",m,c%1000);
else if(m!=0&&n!=0)
printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
return 0;
}
评测结果:
小结:
有了第一次的尝试,我进行了重复的审题,掌握了大致的题意,类似银行支票上的数字,超过一千的类似九千九百九十九需要写成9,999,而超过一百万的数字例如九百九十九万需要写成9,990,000。但是在评测过程中仍然出现了错误。
代入我的几个测试数据,我发现出现了如下情况:
很明显,在代码行:
m=c/1000;
n=c/1000000;
处,m与n的符号并没有发生改变,也就是说,如果输入的是-1000000和9,输出结果是-999,-991。
我此时想到了该题的大致思路:
想法1:c是a与b的和,先将n记录c绝对值的百万位及以上的位数,m记录c绝对值的万位及以上的位数。输出的时候依据m与n是否等于0判断c的大小。
于是我进行了如下修改。
代码 2:
#include<stdio.h>
int main()
{
int a,b,c,m=0,n=0;
scanf("%d %d",&a,&b);
c=a+b;
m=c/1000;
n=c/1000000;
if(c<0)
{
c=-c;
printf("-");
}
if(m==0&&n==0)
printf("%d\n",c);
else if(m!=0&&n==0)
printf("%d,%d\n",m,c%1000);
else if(m!=0&&n!=0)
printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
return 0;
}
评测结果:
小结:
我输入样例:
发现样例是错误的。问题在哪里呢?
再一次输入另一个例子:
恍然大悟:m与n的符号并没有改变。
代码 3:
#include<stdio.h>
int main()
{
int a,b,c,m=0,n=0;
scanf("%d %d",&a,&b);
c=a+b;
if(c<0)
{
c=-c;
printf("-");
}
m=c/1000;
n=c/1000000;
if(m==0&&n==0)
printf("%d\n",c);
else if(m!=0&&n==0)
printf("%d,%d\n",m,c%1000);
else if(m!=0&&n!=0)
printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
return 0;
}
评测结果:
小结:
评测结果的跑分是15/20,说明我大体的方向是正确的,但是仍然有错误。我也百思不得其解,进行了一些测试。
测试样例1:
测试样例2:
测试样例3:
最后,在测试样例4的测试过程中,我发现了问题所在:
测试样例4:
**输入:100000 9 我编写的程序输出:100,9 正确输出:100,009 **
那么问题来了:怎么样才能输出9前面的两个0呢?
请原谅笔者的C语言能力不大扎实,通过咨询他人和查阅相关的资料,我得到了我想要的解决方案。
改正之后:
代码 4:
#include<stdio.h>
int main()
{
int a,b,c,m=0,n=0;
scanf("%d %d",&a,&b);
c=a+b;
if(c<0)
{
c=-c;
printf("-");
}
m=c/1000;
n=c/1000000;
if(m==0&&n==0)
printf("%d\n",c);
else if(m!=0&&n==0)
printf("%d,%03d\n",m,c%1000);
else if(m!=0&&n!=0)
printf("%d,%03d,%03d\n",n,(c%1000000)/1000,c%1000);
return 0;
}
/*-100000 9
-10 9
-9 10
100000 9
-1000 9
9 -1000*/
评测结果:
小结:
令人欣喜的AC。
这里我温习了一遍C语言中遗漏的知识点:格式输出
**参考博客:《printf格式化输出符号详细说明》博主:freemantse **
**链接 :http://blog.csdn.net/xiexievv/article/details/6831194 **
代码四与代码三我做出最大的改变:
printf("%d,%03d,%03d\n",n,(c%1000000)/1000,c%1000);
%03d输出的时候用数字0补充位数。之前很少注意到这个知识点,做这道题也是温习了一遍格式输出。
在解题的过程中,我认为利用m,n进行对c的范围判断过于麻烦和粗糙。于是我打算直接对c进行范围判断,有了如下新的解题思路和第三次尝试。
<3>第三次尝试
想法2:
取c的绝对值,分成0999,1000999999,>=1000000三个大小范围
代码:
#include <stdio.h>
int main()
{
int a, b,c;
scanf("%d %d",&a,&b);
c=a+b;
if(c<0)
{
printf("-");
c=-c;
}
if(c<1000) printf("%d\n",c );
else if(c<1000000) printf("%d,%03d\n",c/1000,c%1000 );
else printf("%d,%03d,%03d\n",c/1000000,c%1000000/1000,c%1000 );
return 0;
}
/*-100000 9
-10 9
-9 10
100000 9
-1000 9
9 -1000*/
评测结果:
小结:
以上的代码是不是比较简洁和明了呢?答案是显然的。
总结:
1.审题需要仔细认真,不能马虎。
2.样例输出是对的,但是结果不一定是正确的,需要大量的样例来测试证明。
3.有时候不同的思路写出来的代码往往具有更好的简洁度和可读性。
以上即是笔者解题的过程和大体思路,不足之处还望大家多多指正。时值猴年新春,祝各位新年快乐!
2016.1.26.