我的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++而言的,對于Java,隻需一行代碼就能實作格式化輸出。
C++代碼
#include<iostream>
#include<cstring>
int main() {
int a, b; //讀取輸入資料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++解題報告
JAVA代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.printf("%,d", a+b);
}
}
JAVA解題報告