1001 A+B Format (20 分)
本道题需要了解的预备知识:string头文件使用方法
中文翻译:(原题目为英文)
计算a+b并以标准格式输出,即:每三位加一个 “,” 的格式输出(若少于四个数字则直接输出)。
输入格式:
每个输入文件包含一个测试用例。每个用例包含一对整数a和b,其中(-10^6 ≤ a,b ≤ 10^6),数字之间用空格分割。
输出格式:
对于每个测试用例,你需要按照格式要求在一行中输出a+b的计算结果。
输入样例:
-1000000 9
输出样例:
-999,991
题目解析:
字符串处理题,较为简单,有两种解题思路,无非都是向字符串中添加逗号输出。如果没思考过的话,先去思考再继续往下看!
首先是柳神的方法,我觉得一般人在考场上都想不出来这么”神奇“的表达式,短短几行代码一边判断一边输(不愧是柳神)。普通人(我)大概率想到的都是:”先加逗号,再输出"的形式。但是正向不好判断逗号的位置,所以从后向前看,每三个数字添加一个逗号,并且需要注意边界情况(第一位数字)。
整体思路如下:
- a+b的结果可能为正数也可能为负数,符号会干扰我们对计算结果的处理(添加逗号)。所以需要在最开始先进行符号处理(判断字符串的第一位字符:若为 “-” 输出负号并删除字符串中的负号,若为数字说明是正数,不需要处理)。
- 字符串从后向前遍历,每三个数字在该数字位上(前)添加一个逗号。
- 注意边界处理,如果出现以下情况,则不可在首位数字前添加逗号。即条件为:当前位不是字符串的第一位(0号位 )且当前位数刚好为三的倍数。
- 处理完成后直接输出,没什么好说的,直接上代码。
#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;
}