杭电刷题——1001

1001:

输入:输入的第一行包含一个整数 T(1<=T<=20), 它表示测试用例的数量。然后 t 行跟随, 每行由两个正整数组成, a 和 b 请注意, 整数非常大, 这意味着您不应该使用32位整数来处理它们。您可以假定每个整数的长度不会超过1000。
输出:对于每个测试用例, 应输出两行。第一行是 "案例 #:", # 表示测试用例的编号。第二行是方程 "a + b = 求和", 求和表示 a + b 的结果注意, 方程中有一些空格。在两个测试用例之间输出空行。

#include<iostream>
#include<string>
using namespace std;

int main(void){
	char a[1000], b[1000];
	int a_int[1001], b_int[1001];
	int t, a_len, b_len, max_len;
	//t判断case次数
	cin >> t;
	for (int i = 1; i <= t; i++){
		cin >> a >> b;
		//计算两个数组实际长度
		a_len = strlen(a);
		b_len = strlen(b);

		int tmp = 0;

		//将字符数组值反向存入整形数组,输入的数字的个位数在a_int[0]
		for (int j = a_len - 1; j >= 0; j--)
		{
			a_int[tmp++] = a[j] - '0';

		}

		tmp = 0;
		for (int k = b_len - 1; k >= 0; k--){
			b_int[tmp++] = b[k] - '0';
		}

		///将两数组用0填充使其位数相等,他们填充后的位数是最大位数加1,而不是只到最大位数,这是为了后面计算方便
		if (a_len>b_len)
		{
			for (int j = b_len; j <= a_len; j++){
				b_int[j] = 0;
			}
			a_int[a_len] = 0;

		}
		else if (a_len<b_len){

			for (int j = a_len; j <= b_len; j++)
			{
				a_int[j] = 0;
			}
			b_int[b_len] = 0;

		}
		else{//当两个位数一样时,都留出1位给进位
			a_int[a_len] = 0;
			b_int[b_len] = 0;
		}
		//求和,最后保存到a_int里面
		max_len = (a_len >= b_len) ? a_len : b_len;
		for (int j = 0; j <= max_len; j++){
			a_int[j] += b_int[j];
			if (a_int[j] >= 10)
			{
				a_int[j] -= 10;
				a_int[j + 1] += 1;
			}
		}

		cout << "Case " << i << ":" << endl;
		cout << a << " " << "+" << " " << b << " " << "=" << " ";
		//判断最高位是否有进位,有就输出
		if (a_int[max_len] == 0){
			for (int j = max_len - 1; j >= 0; j--)
				cout << a_int[j];
		}
		else{
			for (int j = max_len; j >= 0; j--)
				cout << a_int[j];
		}

		if (i != t)
			cout << endl << endl;
		else
			cout << endl;

	}
}

猜你喜欢

转载自blog.csdn.net/qq_42659468/article/details/88411208