面向对象程序设计第二次作业<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. (五)转载:通用定时器PWM输出

    1.     TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  2. Ubuntu下查看linux版本,内核版本,系统位数,gcc版本

    1. 查看linux版本  sunny@ubuntu:~$cat /etc/issueUbuntu 11.04 \n \l 2. 查看内核版本1) sunny@ubuntu:~$ cat /proc/ ...

  3. SQL中行列转换Pivot

    --建表 ),课程 ),分数 int) --插入数据 ) ) ) ) ) ) 1.静态行转列(确定有哪些列) select 姓名, end)语文, end)数学, end)物理 from tb gro ...

  4. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  5. APP性能分析1

    我们使用云测试平台对产品进行了性能测试,情况如下:   详见这里.

  6. sql 遍历结果print和表格形式

    select * from tb_province --省 pID pName1 北京市2 天津市3 上海市4 重庆市5 河北省6 山西省....... select * from tb_city - ...

  7. 如何:从代码创建 UML 类图(ZZ)

      您拖动的一个或多个类将显示在关系图上. 它们依赖的类将显示在"UML 模型资源管理器"中. 参见 模型表示类型的方式. 将程序代码中的类添加到 UML 模型 打开一个 C# 项 ...

  8. CC150 - 11.5

    Question: Given a sorted array of strings which is interspersed with empty strings, write a method t ...

  9. Dynamic Expression.Call Any

    public class Foo { public IList<string> Strings { get; set; } } class Program { static void Ma ...

  10. org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/hive/warehouse/page_view. Name node is in safe mode

    FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.ipc.RemoteExceptio ...