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 ...
随机推荐
- iOS与硬件通讯(socket,data拼接,发送指令,解析指令)
最近项目中用到了iPad驱动硬件来工作,也就是智能硬件的实现.下面简单说下原理,详细说下socket,wifi通信,数据处理接收,发送,以及数据解析代码. 首先,来说下通信.因为硬件部件比较多,我们采 ...
- R语言学习笔记(十八):零碎知识点46-50
seq_along与seq_len函数的使用 在for循环中有用 > seq_along(c(2,3,5)) [1] 1 2 3 > seq_len(3) [1] 1 2 3
- C语言 基础练习40
一.题目 1.输入2个整数,求两数的平方和并输出. 2. 输入一个圆半径(r)当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息. 3.函数y=f(x)可表示为: 4.编写一个程序,从4 ...
- JavaEE笔记(二)
查询load()和get()的区别 # 以下查询都是根据id查询 // Load和Get都会在第一次查询的是创建一个一级缓存查询语句 // 下一次查询的时候从缓存中查询是否有缓存的语句 // 如果有只 ...
- 10.21 (上午) 开课一个月零十七天 (PHP基础语法)
<?php $a = 6; echo $a; //注释语法 /* 多行注释 */ //输出语法 echo "hello"; echo "world",&q ...
- 学习和使用STL
STL是一个标准规范,它只是为容器.迭代器和泛型算法等组件定义了一整套统一的上层访问接口及各种组件之间搭配运用的一般规则,而没有定义组件底层的具体实现方法. STL主要包括下面这些组件:I/O流,st ...
- Bash shell 常用快捷键
1,ctrl+c :强制终止当前命令 2,ctrl+l :清屏 3,ctrl+a :光标移动到行首 4,ctrl+e :光标移动到行尾 5,ctrl+u :从光标所在位置删除到行首 6 ...
- Error:(1, 1) java: 非法字符: ‘\ufeff’
一.问题 用IDEA打开eclipse java项目编译时,出现以下错误: Error:(1, 1) java: 非法字符: '\ufeff' Error:(1, 10) java: 需要class, ...
- MYSQL之视图、触发器、事务
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- asp.net core结合NLog搭建ELK实时日志分析平台
0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍ELK 1.说明(此篇ELK采用rpm的方式安装在服务器上)-牛刀小试 承接上一篇文章的内容准备部署ELK来展示asp ...