由于这道题的整数相加位数过大,已经不可以使用数据类型来定义了,所以只能一位一位的去相加计算,今天学习到的两个重点地方:
本位数字 =( a + b + 前一位进位 )% 10,进位数字=( a + b + 前一位进位 )/ 10,
下面的解法也是从大神那里学习到的,现保存下来,以免忘记,虚心学习,好脑子不如一个烂笔头
#include<bits/stdc++.h>
using namespace std;
char a[1001],b[1001],c[1001],d[1001];
int main()
{
int n,s,num=0;
cin>>n;
while(n--)
{
num++;//用来判断是第几个等式
cin>>a>>b;
int s1=strlen(a);
int t1=0;
int s2=strlen(b);
//将数组a进行反转
for(int i=s1-1;i>=0;i--)
{
c[t1]=a[i];
++t1;
}
//将数组b进行反转
t1=0;
for(int i=s2-1;i>=0;i--)
{
d[t1]=b[i];
++t1;
}
//找到两个数字的最大长度,并将位数补成同位
if(s1>s2)
{
s=s1;
for(int i=s2;i<s1;i++)
{
d[i]='0';
}
}else{
s=s2;
for(int i=s1;i<s2;i++)
{
c[i]='0';
}
}
//按照加法法则,本位数字=(数字1+数字2+前一位进位)%10
int t=0,x1,x2;
for(int i=0;i<s;i++)
{
x1=c[i]-'0';
x2=d[i]-'0';
d[i]=(x1+x2+t)%10+'0';
t=(x1+x2+t)/10;
}
//判断最高位是否有进位
if(t==0)
{
cout<<"Case "<<num<<":"<<endl;
cout<<a<<" + "<<b<<" = ";
for(int i=s-1;i>=0;i--)
{
cout<<d[i];
}
if(n!=0)
{
cout<<endl<<endl;
}else{
cout<<endl;
}
}else{
cout<<"Case "<<num<<":"<<endl;
cout<<a<<" + "<<b<<" = ";
char c='1';//最高位有进位时,进位值也是1
strcat(d,&c);//strcat:将两个char类型连接。
for(int i=s;i>=0;i--)
{
cout<<d[i];
}
if(n!=0)
{
cout<<endl<<endl;
}else{
cout<<endl;
}
}
}
return 0;
}