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

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

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函数取绝对值。

完整代码

#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;  
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注