随笔二代码

Github
1001. A+B Format (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).

Input

Each input file contains one test case. Each case contains a pair of integers a and b where -1000000 <= a, b <= 1000000. The numbers are separated by a space.

Output

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.

Sample Input
-1000000 9
Sample Output
-999,991

题目

意思就是输入两个数,这两个数的总和从个位数往上数,每三个数加个逗号,比如1,234,567或是123,456或是123酱紫。

思路

  • 第一反应是先考虑正负,计算过程若牵扯到正负会很麻烦,所以一开始我就分了两种情况,若总和为负数,先输出负号,再将总和乘以负一,这就解决正负了,后面便是分段了。
  • 从题目给的限制可知总和最多是七位数,所以只有三种情况:
    (1)没有逗号,总和数最多有三位;
    (2)有一个逗号,总和数至少四位,至多六位;
    (3)有两个逗号,总和数七位;
  • 如何将其分段,一开始是想利用数组,将整数存入数组中,再判断整数个数,然后再加个<string.h>和strlen来判断加几个逗号,后来上百度搜了下如何将整数转成字符,就是sprintf or itoa,感觉有点小越界,便在纠结下放弃了。
  • 初思路一断,后面就不好想了,其实最重要的是如何将他分段,它最多分成三段,如1,234,567。假设1所在的位置为A区,234所在位置为B区,567所在位置为C区,现在就是看ABC区是否有数字存在。
  • 抽茧拨丝细细算下来,
    • 先看A区,是否有数字存在,将总和除以1000000取整,好了,这个结果可以当成一个大的判断条件了,分为取整为零和取整不为零。
    • 再看C区,将总和除以1000取余,放到这,这个是铁板钉钉了,C区是一定有数字,不用考虑有几个。
    • 重头戏就是B区了,这个是第二个判断条件了,先将中和除以1000000取余,这个时候已经和A区划开关系了,只用考虑BC区就好,再将取余后的数除以1000取整,这个时候得到的就是B区的数,判断条件分为结果为零或不为零。
  • 所以,最后归类好的条件就是:
    (1)A区有数;(两个逗号)
    (2)A区无数,B区有数;(一个逗号)
    (3)AB区均无数;(无逗号)
  • printf这段有三个写法,第一种情况A区为%d,BC为%03d,这个是为了避免这种情况:总和为1002345.输出却是1,2,345.第二种是B区为%d,C区为%03d,第三种是C区是%d.
    思路就是这样的,代码附上:
    提交结果附上:

结果有两个错误,最后调试时发现有种情况没试

忘了第二种情况时B区打头阵,是不需要%03d的。
修改后的源代码:

又提交了下

答案正确了。

提交了三次,有次还没选对编辑器。。。。
看了下提交分数,哎,任重道远啊,继续加油吧!

原文地址:https://www.cnblogs.com/breakbreak/p/6360860.html