面向对象程序设计第二次作业<1>

Github 链接:https://github.com/Wasdns/object-oriented

题目:

<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.

程序设计第二次作业<1>的更多相关文章

  1. C语言程序设计第二次作业--顺序结构

    C语言程序设计第二次作业--顺序结构 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido ...

  2. hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b

    hdoj上一道有意思的题目,题目: 人见人爱a+b 敲的也蛮快的,大概十分钟左右就AC了.代码如下: 人见人爱a+b #include<stdio.h> int main() { int ...

  3. 面向对象程序设计 第二次作业<1>

    Github链接:https://github.com/zora02/object-oriented/tree/master/1001.A%2BB%20Format%20(20) 一.解题 题目 解题 ...

  4. C语言程序设计第二次作业

    一.学习内容 掌握关系运算符.逻辑运算符.条件运算符 掌握常用数学函数的用法 if语句(单分支,双分支和多分支) 用switch语句实现多分支 理解多个if语句,if...else if... 和if ...

  5. C语言程序设计第二次作业——顺序结构

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1: 错误原因:i和d位置错误 改正方法:i和d位置互换 错误信息2: 错误原因:\n后缺了一个" 改正方法:\n后加一个 ...

  6. C语言程序设计第二次作业——

    1,编译过程过程中的错误缺引号和分号并且拼写错误. 正确结果: 2,编译过程 改正错误: 正确结果: 3,利用SIZEOF运算符求出的数据类型所占字节大小: 4,在头文件LIMITS.H中相关的编译 ...

  7. C语言程序设计第二次作业—————顺序结构改

    1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido.h> int mian() { ...

  8. C语言程序设计第二次作业1

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  9. C语言程序设计第二次作业0

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

随机推荐

  1. ECSHOP去版权与标志

    前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop 前者在后台商店设置 - 商店标题修改 后者打开includes/lib_main.php $page_t ...

  2. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  3. svn 提交冲突(目录下删除文件)

    [root@v01 webtest]# svn ci -m "delete kkk" svn: Commit failed (details follow): svn: Abort ...

  4. JUC回顾之-AQS同步器的实现原理

    1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双 ...

  5. Spark编译安装和运行

    一.环境说明 Mac OSX Java 1.7.0_71 Spark 二.编译安装 tar -zxvf spark-.tgz cd spark- ./sbt/sbt assembly ps:如果之前执 ...

  6. [杂] ASP.NET MVC 之 Route To MvcHandler

    首先,本文参考了不少东东,仅供Q_L_H自己使用,ZZ自己负责.先上一张全家福: HttpModules and HttpHandlers ASP.NET MVC 是 HttpHandler. Url ...

  7. 8.Smack类库

    1.登陆IM Connection.DEBUG_ENABLED = true;//首先激活调试模式 1.1建立连接 首先,在启动DSM Message时,客户端通过XMPPConnection与服务器 ...

  8. Unity3D中Update和Lateupdate的区别

    Unity中Update和Lateupdate的区别.Lateupdate和Update每一祯都被执行,但是执行顺序不一样,先执行Updatee然后执行lateUpdate. 如果你有两个脚本JS1. ...

  9. 【转】CSS清除浮动_清除float浮动

    CSS清除浮动方法集合 一.浮动产生原因 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 浮动产生样式效果截图 ...

  10. 阿牛的EOF牛肉串[HDU2047]

    阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...