HZNUOJ

Input-Output Lecture (3) for ACM Freshman

Tags:   字符串模拟    有意思
Time Limit:  1 s      Memory Limit:   32 MB
Submission:2222     AC:1168     Score:34.34

Description

给出两个正整数a和b,计算a+b的值。

Input

第一行是一个数字T,代表有T组输入。

接下来有T行,每行代表一组输入,每组包含两个不超过1000位的正整数a和b。

Output

对于每组输入,输出两行,第一行为”Case i:”(不包含双引号,其中i为第i组测试数据),第二行为a+b的值,每组测试数据之后加一个空行。

Samples

input
2 1 5 1000000000000000000000000000000 1000000000000000000000000000000
output
Case 1: 6 Case 2: 2000000000000000000000000000000

Hint

如果做过前面的题目,此题在输入输出格式上不会碰到啥问题,相较于Lecture (1) 的格式,只是多了测试数据的计数而已和最后的回车而已。本题的主要问题在于如何储存长达1000位的整数并让它们相加,显然使用int或long long都没法存下这个“庞然大物”。此时我们需要另寻它法。如果你用的是Java,那么本题你可以使用Java内置的BigInteger类轻松解决,如果是C/C++,那么本题只能使用长度为1000的数组来储存这个数字了,为了方便读入,可以使用字符串来储存这些数字,并模拟加法使他们相加。这里还需要注意,a和b都不超过1000位,但它们相加的值可能超过1000位,因此在用C风格字符串时,需要格外注意数组是否足够大。
因此我们可以写出如下代码:


C语言版:

#include<stdio.h>
#include<string.h>
int main() {
	int i, t, T, aLen, bLen, add, sum;
	char a[1002], b[1002], c[1002], temp;
	scanf("%d", &T);
	for (t = 1; t <= T; t++) {
		scanf("%s %s", a, b);
		// 获取数字长度
		aLen = strlen(a);
		bLen = strlen(b);
		// 将数字反转,使其从个位开始对齐
		for (i = 0; i<aLen / 2; i++) {
			temp = a[i];
			a[i] = a[aLen - i - 1];
			a[aLen - i - 1] = temp;
		}
		for (i = 0; i<bLen / 2; i++) {
			temp = b[i];
			b[i] = b[bLen - i - 1];
			b[bLen - i - 1] = temp;
		}
		add = 0;
		// 开始模拟加法
		for (i = 0; i<aLen || i<bLen; i++) {
			if (i<aLen && i<bLen)
				sum = a[i] - '0' + b[i] - '0' + add;
			else if (i < aLen)
				sum = a[i] - '0' + add;
			else if (i < bLen)
				sum = b[i] - '0' + add;
			add = 0;
			if (sum > 9) {
				add = 1;
				sum -= 10;
			}
			c[i] = sum + '0';
		}
		// 若加完后还有进位,则补上
		if (add) c[i++] = add + '0';
		// 逆序输出相加的和
		printf("Case %d:\n", t);
		for (i--; i >= 0; i--)
			printf("%c", c[i]);
		puts("\n");
	}
	return 0;
}




C++版:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() {
	int i, T, aLen, bLen, add, sum;
	string a, b, c;
	cin >> T;
	for (int t = 1; t <= T; t++) {
		cin >> a >> b;
		// 获取字符串长度
		aLen = a.length();
		bLen = b.length();
		// 反转a和b,使其从个位开始对齐
		reverse(a.begin(), a.end());
		reverse(b.begin(), b.end());
		c = ""; // c=a+b
		add = 0; // 进位
				 // 开始模拟加法
		for (i = 0; i<aLen || i<bLen; i++) {
			if (i<aLen && i<bLen)
				sum = a[i] - '0' + b[i] - '0' + add;
			else if (i < aLen)
				sum = a[i] - '0' + add;
			else if (i < bLen)
				sum = b[i] - '0' + add;
			add = 0;
			if (sum > 9) {
				add = 1;
				sum -= 10;
			}
			c += sum + '0';
		}
		// 若加完后还有进位,则补上
		if (add) c += add + '0';
		// 逆序并输出
		reverse(c.begin(), c.end());
		cout << "Case " << t << ":" << endl;
		cout << c << endl << endl;
	}
	return 0;
}



Java版:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		int T;
		BigInteger a, b;
		Scanner in = new Scanner(System.in);
		T = in.nextInt();
		for (int t = 1; t <= T; t++) {
			a = new BigInteger(in.next());
			b = new BigInteger(in.next());
			System.out.println("Case " + t + ":");
			System.out.println(a.add(b) + "\n");
		}
		in.close();
	}
}


Author

CHEN, Yupeng