面向对象程序设计第二次作业<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. C++基础(2)

    c++规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数. 析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只 ...

  2. editplus快捷键大全

    Eclipse快捷键 10个最有用的快捷键 1. ctrl+shift+r:打开资源 ctrl+b编译 ctrl+d删除 2. ctrl+o:快速outline  --->这个是查看一个类中的用 ...

  3. primace 5.0软件的Debug ware 功能的使用方法简介

    用primace 软件已经一年多了,一直不知道Debug ware 软件怎么使用,上周终于逮住FAE请教了下这个功能的使用方法.发现这个功能和signalTap ii 原理不一样,这个是非时事的波形, ...

  4. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  5. Freemarker中遍历List以及内置函数使用

    在Freemarker应用中经常会遍历List获取需要的数据,并对需要的数据进行排序加工后呈现给用户. 那么在Freemarker中如何遍历List,并对List中数据进行适当的排序呢?一. Free ...

  6. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  7. PHP 过滤 及 字符转换 函数

    PHP过滤html标签的内部函数. php过滤html的函数: strip_tags(string) 这样就可以过滤掉所有的html标签了. 如果想过滤掉除了<img src="&qu ...

  8. google svn 服务器使用(免费SVN服务器)

    转自:http://hi.baidu.com/%C0%AF%B1%CA%B9%A4%D7%F7%CA%D2/blog/item/d6f6c6d7707d81d0a044df5f.html 1. 进入h ...

  9. cocos2dx游戏开发——微信打飞机学习笔记(八)——EnemyLayer的搭建

    一.创建文件= =               EnemyLayer.h               EnemyLayer.cpp Ps:我绝对不是在凑字数~. 二.How to do? (1)一些宏 ...

  10. ember.js:使用笔记8 加载测试与集成测试

    emberjs使用的测试工具为qunit.js: 加载:将runner.js添加到Index.html:大致内容: if (window.location.search.indexOf("? ...