版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/83956416
我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805528788582400
题目描述:
题目翻译:
1001 格式化输出A + B
计算a + b且以标准形式输出其和,该标准形式就是——所有的数组以3个为一组被逗号分隔,除非数字位数小于4。
输入格式:
每个输入文件包含一个测试用例。每个测试用例包含两个整数a和b,-10 ^ 6 <= a, b <= 10 ^ 6。数字由一个空格分隔。
输出格式:
对每个测试用例,你需要在一行中输出a和b的和。且该和必须以标准形式输出。
输入样例:
-1000000 9
输出样例:
-999,991
知识点:字符串
思路:由低位到高位3位一组分组,处理好负号和最后的逗号问题
时间复杂度和空间复杂度的分析对本题意义不大。
对于和为0,特殊处理。
不管是负数还是正数,统一转换成正数处理,并由一个标记变量flag来标记是否为负数。由低位到高位3个一组填充进字符数组中,组与组之间用','分隔。
这时候字符数组的最后一个字符可能是',',还需要考虑和是负数的情况额外添加'-'。
C++代码:
#include<iostream>
#include<cstring>
int main() {
int a, b;
scanf("%d %d", &a, &b);
int sum = a + b;
if(sum == 0) { //对和为0的情况做特殊处理
printf("0\n");
return 0;
}
bool flag = true; //flag用以标记和是否是负数
if(sum < 0) {
flag = false;
sum *= -1;
}
char result[15];
int index = 0; //记录char数组result的下标
int circle = 0; //记录循环,每3个数字添加一个","
while(sum > 0) {
result[index++] = sum % 10 + '0';
circle++;
sum /= 10;
if(circle % 3 == 0) {
result[index++] = ',';
circle = 0;
}
}
if(result[index - 1] == ',') {
if(!flag) {
result[index - 1] = '-';//如果末位是",",且和是负数,将","替换为"-",并添加"\0"结束标记
result[index] = '\0';
} else {
result[index - 1] = '\0';//如果末位是",",且和不是负数,将","替换为"\0"结束标记
}
} else {
if(!flag) { //如果末位不是",",且和是负数,添加"-"
result[index++] = '-';
}
result[index] = '\0'; //在末位添加"\0"结束标记
}
for(int i = strlen(result) - 1; i >= 0; i--) {
printf("%c", result[i]);
}
printf("\n");
return 0;
}
C++解题报告: