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;
}
}