天天看点

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