A + B问题II
问题描述
我有一个非常简单的问题。给定两个整数A和B,你的工作是计算A + B的和。
输入
输入的第一行包含整数T(1 <= T <= 20),表示测试用例的数量。然后是T行,每行包含两个正整数,A和B.请注意,整数非常大,这意味着您不应该使用32位整数来处理它们。您可以假设每个整数的长度不超过1000。
输出
对于每个测试用例,您应输出两行。第一行是“案例#:”,#表示测试用例的编号。第二行是方程“A + B = Sum”,Sum表示A + B的结果。注意方程中有一些空格。在两个测试用例之间输出一个空行。
样本输入
2
1 2
112233445566778899 998877665544332211
样本输出
情况1:
1 + 2 = 3
案例2:
112233445566778899 + 998877665544332211 = 1111111111111111110
思路:
既然无法直接用int,long int等直接定义求解出题目,所以我们用字符串解决问题。
由于反向存储可以使得我们在进行两个数相加或相乘的时候可以顺着来,即从数组下标0开始往下,
举个例子:89 + 89
如果我们不反向,直接将其存储在整数数组,那么
89
+ 89
----
1 78得到178 但这就以为着我们是从后往前加的,这提升了复杂性,我们可以从前往后加,方便思考
反向加:
98
+ 98
----
87 1得到178
如果不理解上述过程 可以看另一篇博文:https://blog.csdn.net/szlg510027010/article/details/84325598
我们是从后往前加,但我们读数的时候是从前往往加的,为了更方便思考,所以我们可以反向加,进位是往后进位的
所以我们将字符数组存放到数字数组的时候可以反向存储
之后进行反向加,再进行反向打印即可。
AC代码:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[1000],b[1000];//用于存放大数
int a_int[1001],b_int[1001];//用于将大数转化为整数
int n,a_len,b_len,max_len;
//n为case次数
cin>>n;
for(int i=1;i<=n;i++)
{
//输入两个数
cin>>a>>b;
a_len = strlen(a);//大数 a 的长度
b_len = strlen(b);//大数 b 的长度
int tmp = 0;
//将字符串数组反向存入整形数组,
//a_int[0] 存放的是字符数组的个位数
//字符数组最后一位是 '\0' 要减去
for(int j=a_len-1;j>=0;j--)
a_int[tmp++] = a[j] - '0';
tmp = 0;
for(int j=b_len-1;j>=0;j--)
b_int[tmp++] = b[j] - '0';
//将两个数组的位数填充至相等的状态,并且增多一位,
//目的是如果后面有进位,则方便运算
//如果位数是相等的,则同时进位即可
if(a_len==b_len)
{
a_int[a_len] = 0;
b_int[b_len] = 0;
}
//如果位数不等,则补位后再进位
else 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(b_len>a_len)
{
//补位 + 进位
for(int j=a_len;j<=b_len;j++)
a_int[j] = 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!=n)
cout<<endl<<endl;
else
cout<<endl;
}
}