PAT甲级 1001 A+B Format (20 分) 全网最细 题目详解 翻译 完整代码 PAT真题解析

1001 A+B Format (20 分)

本道题需要了解的预备知识string头文件使用方法

中文翻译:(原题目为英文)

计算a+b并以标准格式输出,即:每三位加一个 “,” 的格式输出(若少于四个数字则直接输出)。

输入格式:

每个输入文件包含一个测试用例。每个用例包含一对整数a和b,其中(-10^6 ≤ a,b ≤ 10^6),数字之间用空格分割。

输出格式:

对于每个测试用例,你需要按照格式要求在一行中输出a+b的计算结果。

输入样例:

-1000000 9

输出样例:

-999,991


题目解析:

字符串处理题,较为简单,有两种解题思路,无非都是向字符串中添加逗号输出。如果没思考过的话,先去思考再继续往下看!
首先是柳神的方法,我觉得一般人在考场上都想不出来这么”神奇“的表达式,短短几行代码一边判断一边输(不愧是柳神)。普通人(我)大概率想到的都是:”先加逗号,再输出"的形式。但是正向不好判断逗号的位置,所以从后向前看,每三个数字添加一个逗号,并且需要注意边界情况(第一位数字)。

整体思路如下:

  1. a+b的结果可能为正数也可能为负数,符号会干扰我们对计算结果的处理(添加逗号)。所以需要在最开始先进行符号处理(判断字符串的第一位字符:若为 “-” 输出负号并删除字符串中的负号,若为数字说明是正数,不需要处理)。
  2. 字符串从后向前遍历,每三个数字在该数字位上(前)添加一个逗号。
    在这里插入图片描述
  3. 注意边界处理,如果出现以下情况,则不可在首位数字前添加逗号。即条件为:当前位不是字符串的第一位(0号位 )且当前位数刚好为三的倍数。
    在这里插入图片描述
  4. 处理完成后直接输出,没什么好说的,直接上代码。
#include <iostream>
using namespace std;
int main() {
    
    
    int a, b;
    cin >> a >> b; //输入a和b
    string s = to_string(a + b); //将a+b的值转换为字符串
    if(s[0] == '-') {
    
     //处理符号
        cout << '-';
        s.erase(0, 1);
    }
    int count = 0; //用于记录当前位置
    for(int i = s.length() - 1; i >= 0; i--){
    
     //添加逗号
        count++;
        if(count % 3 == 0 && i > 0){
    
    
            s.insert(i, ",");
        }
    }
    cout << s;
}

全部通过
在这里插入图片描述
最后附上柳神的代码,如果有兴趣的话可以研究一下那个“神奇”的表达式。
柳神柳神,永远滴神。

#include <iostream>
using namespace std;
int main() {
    
    
    int a, b;
    cin >> a >> b;
    string s = to_string(a + b);
    int len = s.length();
    for (int i = 0; i < len; i++) {
    
    
        cout << s[i];
        if (s[i] == '-') continue;
        if ((i + 1) % 3 == len % 3 && i != len - 1) cout << ","; // 神秘表达式
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/BBBling/article/details/115334110