天天看點

PAT-ADVANCED1001——A+B Format

我的PAT-ADVANCED代碼倉

https://github.com/617076674/PAT-ADVANCED

原題連結

https://pintia.cn/problem-sets/994805342720868352/problems/994805528788582400

題目描述

PAT-ADVANCED1001——A+B Format

題目翻譯

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++解題報告

PAT-ADVANCED1001——A+B Format

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解題報告

PAT-ADVANCED1001——A+B Format