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 ...
随机推荐
- GoogleTest初探(1)
此篇主要了解一下GoogleTest中的断言. 总的来说,GoogleTest中的断言分为两大类:EXPECT_*和ASSERT_*,这两者在测试成功或失败后均会给出测试报告,区别是前者在测试失败后会 ...
- #leetcode刷题之路39-组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...
- Django:settings中关于static静态文件目录的设置
django项目settings中关于静态资源存放位置的设置 主要涉及以下3项:STATIC_URL.STATICFILES_DIR和STATIC_ROOT 1.STATIC_URL 这项是必须配置的 ...
- jquery 获取checkbox的checked属性总是undefined
项目中用的jquery1.9 今天需要检测一个checkbox的选中状态,想当然的用 .attr("checked") ,结果发现,无论是否选中,这个值都是 undefined 未 ...
- sublime常用方法
1.如何打开一个文件夹? project----->Add Folder to Project 2.如何同一个窗口下进行分屏操作? 使用快捷键:shift+Alt+2 3.如何使html代码进行 ...
- centos7 安装postgres9.4
1.安装postgres资源:> yum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_ ...
- js中哈希表的几种用法总结
本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...
- encodeURIComponent(URIstring)
函数可把字符串作为 URI 组件进行编码.
- 大数据中HBase的Java接口封装
该文前提为已经搭建好的HBase集群环境,参见 HBase集群搭建与配置 ,本文主要是用Java编写一个Servlet接口,部署在Tomcat服务器上,用于提供http的接口供其他地方调用,接口中集成 ...
- nginx遇到的配置问题
配置的例子如下: server { listen ; server_name localhost; #kzjtrans-web location /kzjtrans-web/ { proxy_pass ...