1001. A+B Format (20)的解题思路以及多源代码文件的尝试编写
前言
这几天刚学了多源代码文件的编译,因为想尝试使用一下这种方法,所以想用此编写这次作业的程序。正好可以learning by doing,在做当中学习新知识。(编译器为Dev-C++)
git提交
[pdf的地址](http://files.cnblogs.com/files/vancasola/作业1的pdf.pdf)
大致题意
输入两个整数,将他们之和输出,每三位数以逗号隔开。
思路一
将输入的东西全部转化为数组,再逐个输出。
思路二
直接得到一个数字,通过数学运算来输出。此方法思路比较自然,主要是按输出时逗号的个数来讨论,可以将情况分为三种:
- 出现一个逗号
- 出现两个逗号
- 不出现逗号
然后在不同的情况下采用不同的输出格式。
首先,建立一个工程

将代码的大体框架打出来
包括变量的定义以及三种情况
int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d);
if(d0>999999)
if(1000<=d0<=999999)
if(d0<1000)
return 0;
}
写一个头文件c.h声明函数
包括三种情况下使用的函数
int c_max(int c);
int c_min(int c);
int c_mid(int c);
添加头文件后
main函数的完整代码
#include<stdio.h>
#include<math.h>
#include"c.h"
int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d);
if(d0>999999)
c_max(d);
if(1000<=d0<=999999)
c_mid(d);
if(d0<1000)
c_min(d);
return 0;
}
其中三种情况对应为三个自定义函数,自定义函数的命名是按照输入两数之和的大小,6位数以上的为c_max,3位数及以下的为c_min,最后一个为c_mid。
c_max
//c的绝对值大于1000000
#include<stdio.h>
#include<math.h>
int c_max(int c)
{
if(c>0)
{
printf("%d,%03d,%03d",
c/1000000,
(c%1000000-c%1000)/1000,
((((c%1000000)%100000)%10000)%1000));
}
else
printf("%d,%03d,%03d",
c/1000000,
(-1)*(c%1000000-c%1000)/1000,
(-1)*((((c%1000000)%100000)%10000)%1000));
return 0;
}
函数又按照和的正负来分采用不同的输出方式,将输入的数字分为三段,每段为一个数字,如1234567,它可以被看作3个数字1、234、567,然后通过取余1234567来得到这三个数字。
刚开始我的格式输出符为%d,%d,%d,当测试数据1,023,000,时,输出就成了1,23,0,显然不符合题目的要求,所以我将输出符改成了%d,%03d,%03d,3将输出的字段大小定为3,如果字段大小小于3,那么0就会在数字前面被补上,直到字段大小等于3,这样就完美地解决了这个问题。
至于和为负数时,因为取余后三个数字一定都是负数,所以只要在将后两个数字乘上-1而第一个不变,这样输出时第一个数字前就有一个负号,而后两个数字均为正数。
c_mid
#include<stdio.h>
#include<math.h>
int c_mid(int c)
{
if(c>0)
{
printf("%d,%03d",
c/1000,
((((c%100000)%10000)%1000)));
}
else
printf("%d,%03d",
c/1000,
(-1)*((((c%100000)%10000)%1000)));
return 0;
}
c_min
#include<stdio.h>
#include<math.h>
int c_min(int c)
{
if(c>=0)
printf("%d",c);
else
printf("%d",c);
return 0;
}
后两段代码的原理其实和c_max是一样的, 而且更加简单。
编写完这5个程序后就可以编译运行了,可是当输入1 1 时竟然会有这样的输出!

再测试中间段数据

中间段的输出却是正确的,于是我猜想是不是条件语句出了问题,但是乍一看却没有发现,所以我分别在三个条件后面加入一个输出,当进入该条件时会在屏幕上显示一些东西,比如插入一条printf("MIM");那么进入if(d0<=999)时屏幕上就会显示MIN。
分别插入输出语句后,发现输入1 1 时,进入了后两个if,发现问题的确出现在条件语句。仔细查看后发现第二个条件语句竟然犯了如此低级的错误:if(1000<=d0<=999999)。
将代码修正后if(d0>=1000&&d0<=999999),重新编译文件后,输出就正常了。
接下来又设计了一系列测试数据来测试代码中各个部分以及临界点的输出(以下直接写出两数之和)
- 1
- 1000
- 1000000
- 2021020
发现结果全部正确,于是将代码整合在一个文件中,在网站上提交:

答案正确。
附上完整版代码
#include<stdio.h>
#include<math.h>
int c_max(int c);
int c_min(int c);
int c_mid(int c);
int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d);
if(d0>999999)
c_max(d);
if(d0>=1000&&d0<=999999)
c_mid(d);
if(d0<1000)
c_min(d);
return 0;
}
int c_max(int c)
{
if(c>0)printf("%d,%03d,%03d",
c/1000000,
(c%1000000-c%1000)/1000,
((((c%1000000)%100000)%10000)%1000));
else printf("%d,%03d,%03d",
c/1000000,
(-1)*(c%1000000-c%1000)/1000,
(-1)*((((c%1000000)%100000)%10000)%1000));
return 0;
}
int c_mid(int c)
{
if(c>0)printf("%d,%03d",
c/1000,
((((c%100000)%10000)%1000)));
}
else printf("%d,%03d",
c/1000,
(-1)*((((c%100000)%10000)%1000)));
return 0;
}
int c_min(int c)
{
if(c>=0)printf("%d",c);
else printf("%d",c);
return 0;
}
(还是分为多个源文件的代码看起来简洁一点)
总结
多源代码文件方面
- 建立一个工程。(之前文件一直没能成功编译就是少了它)
- 在头文件中声明函数。
- 将主函数与自定义函数分开写。
- 注意函数和变量不要重复定义。
include"c.h" 中 ""表示被包含文件位于当前工作目录下。
解题方面
- 按照讨论的不同情况先写出程序框架
- 格式输出时使用%03d来控制前导零
- 使用一些输出来检查bug
文末附上作业的一、二题


1001. A+B Format (20)的解题思路以及多源代码文件的尝试编写的更多相关文章
- 关于‘1001.A+B Format (20)’的解题报告
1001.A+B Format(20) 首先要感谢一下指导我github上传问题的小伙伴们,捣腾了一整天我终于摸到了一点门路,真的谢谢你们. 小豪的github 问题描述: Calculate a + ...
- PAT 甲级1001 A+B Format (20)(C++ -思路)
1001 A+B Format (20)(20 分) Calculate a + b and output the sum in standard format -- that is, the dig ...
- 1001.A+B Format (20)的解题
关于A+B的正确打开方式! 解题思路 gitub 也是研究了很久才学会了本地上传,中间还遇到一些问题,多亏学长的教程跟搜索引擎的帮忙解决啦! 我想还是了解题目的意思是解题的最关键,通过了查词软件跟自身 ...
- "1001. A+B Format (20)" 解题报告
Github : git@github.com:Circlecos/object-oriented.git PDF Of Markdown : "1001. A+B Format (20)& ...
- 1001.A+B Format (20)(思路,bug发现及其修改,提交记录)
https://github.com/031502316a/object-oriented/tree/master/1001 ---恢复内容开始--- 1.解题思路 一开始见到题目时,感觉难的就是输出 ...
- 1001. A+B Format (20) (%0nd)
1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calculate ...
- PAT-PAT (Advanced Level) Practise 1001. A+B Format (20) 【二星级】
题目链接:http://www.patest.cn/contests/pat-a-practise/1001 题面: 1001. A+B Format (20) Calculate a + b and ...
- 1001.A+B Format (20)代码自查(补足版)
1001.A+B Format (20)代码自查(补足版) 谢谢畅畅酱的提醒,发现了代码中的不足,把变量名更改成更合理的名字,并且把注释也换成英文啦! 栋哥提供的代码自查的方式也帮助了我发现很多代码中 ...
- PAT 甲级 1001 A+B Format (20)(20 分)
1001 A+B Format (20)(20 分) Calculate a + b and output the sum in standard format -- that is, the dig ...
随机推荐
- html 头标签 <meta http-equiv 属性应用。
比较常用的 1. 网页出现乱码时设置字符集 <meta http-equiv="content-Type" content="text/html; charset= ...
- 深入虚拟内存(Virtual Memory,VM)
我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM.它通常指的是插在主板上的内存条,给进程提供临时数据存储的设备.因为 CPU 可以直接从物理内存中读取数据和指令,所 ...
- 20155202 张旭 课下作业: Linux下IPC机制
20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...
- Java线程和多线程(十四)——Synchronized关键字解析
曾经有一个比较有趣的面试问题,那就是,关于使用synchronized关键字,是用在方法上面尾号,还是用在一个代码块上面为好? 答案就是使用锁定代码块为更好.因为这样不会锁定对象.当synchroni ...
- [UOJ266]Alice和Bob又在玩游戏
[UOJ266]Alice和Bob又在玩游戏 Tags:题解 作业部落 评论地址 TAG:博弈 题意 不同于树的删边游戏,删掉一个点删去的是到根的路径 题解 这题只和计算\(SG\)有关,博弈的有关内 ...
- 苏州优步uber司机奖励政策(持续更新)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- mfc 私有成员
知识点 类的私有成员private 访问类的私有成员 内联函数inline 一.类的私有成员 用private定义的(变量)或者(函数)只能在本类中使用其他类不能中不能调用: 用public定义的(变 ...
- 洛咕 P3964 [TJOI2013]松鼠聚会
有个结论就是把坐标\((x,y)\)变形成\(((x+y)/2,(x-y)/2)\),切比雪夫距离就变成了曼哈顿距离. 所以变换一下坐标直接统计答案即可. // luogu-judger-enable ...
- Storm 第一章 核心组件及编程模型
1 流式计算 流式计算:数据实时产生.实时传输.实时计算.实时展示 代表技术:Flume实时获取数据.Kafka/metaq实时数据存储.Storm/JStorm实时数据计算.Redis实时结果缓存. ...
- SQL Server 日期格式和日期操作
SQL Server发展至今,关于日期的格式的控制方法,有传统的方法,比如CONVERT(),也有比较便利的新方法,比如FORMAT():同样,关于日期的操作函数,也分为传统方法:DATEADD()等 ...