山河永寂,人间长情

0%

PAT (Advanced Level)-1001. A+B Format (20)

PAT (Advanced Level)-1001. A+B Format

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).
计算a+b并在标准格式下输出这个和。(这个和的数据应该分为三部分:前面的几位数,逗号,后三位。除非数字小于三位数)


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.
程序接受输入的两个数a和b,a和b都满足在区间[-1000000, 1000000]。输入的两个数用空格间隔开。

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.

在一行内输出a和b的和。并且这个和应该用标准格式写出。 (注意上面的题目要求,这个和应该分为三部分:后面三位,逗号,和剩下的前面的几位数。)

Sample Input
-1000000 9
Sample Output
-999,991


解读

程序有两个输入的变量a,b
计算a+b(我们记sum=a+b)
一个输出变量sum,依照格式分为三部分。

思路如下:

  1. 判断sum是否满足大于三位数。
  2. 如果小于三位数:
    直接输出sum。
  3. 如果大于三位数,小于七位数:
    将sum拆分成两部分head(前面三位)和tail(后面三位)。
    • tail后三位我们可以直接对sum对1,000取余获得(需要取绝对值)。
    • head前三位我们可以对sum除以1,000后取余对1000获得。(因为int型变量没有小数点精度,所以sum除以1,000会舍弃后最后三位数的部分)
    • 输出head、逗号(,)、tail即可。
  4. 如果是七位数:
    将sum拆分为三部分,第七位,中间三位(head),后面三位(tail)。
    • 最高位我们可以让sum除以1,000,000来舍弃后面六位数来。(原理见上面int型变量)
    • 中间三位head前三位我们可以对sum除以1,000后对1000取余获得。(需要取绝对值)
    • 后三位我们可以直接对sum对1,000取余获得。(需要取绝对值)
    • 输出第七位、逗号(,)、head、逗号(,)、tail即可。
  • 这里需注意的是,对于100,009这样的数,取后三位应该是009,但是上述办法我们计算得到的tail数值是9(自动舍弃前面的0)。这个是个需要注意的问题(对于中间三位数,也会有类似的情况),我们在cout输出的时候进行修正。
  • 修正方法,用setw(3)来限定每次输出限定的位数为3。不足位用setfill(‘0’)代码补充为0
  • 另外,不论合适对sum原始数据进行修改,都会保留负号(如果是负数的话),所以我们对于分部的部分在输出时候就需要用abs函数取绝对值。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int a, b,sum;
int tail=0, head=0;
cin >> a >> b;
sum = a + b;
tail = sum % 1000; //计算 个十百位(123位) 上的数字
//判断是否大于三位数
if (sum/1000==0) //三位数之内
cout << tail << endl;
else{
head = (sum / 1000) % 1000; //取 千万十万位(456位) 上的数字

if ((sum / 1000) /1000 == 0) //六位数之内
cout << head << "," << setw(3)<<setfill('0')<<abs(tail) << endl;
else //七位数
cout << sum/1000000 << "," << setw(3)<<setfill('0')<<abs(head) << "," <<setw(3)<<setfill('0')<< abs(tail) << endl;
}
return 0;
}