给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Sample Input
68932147586
468711654886
Sample Output
537643802472
我今天真是神经了,不知道怎么回事,一个a+b写了300+的代码。。。
AC代码如下:
#include
#include
#include
#include
using namespace std;
const int maxn = 1e4+10;
char s1[maxn];
char s2[maxn];
int a[maxn];
int b[maxn];
int c[maxn];
int main()
{
int f1=0,f2=0;
int flag=0;
int h=-1;
scanf("%s%s",s1,s2);
if(s1[0]=='-') f1=1;
if(s2[0]=='-') f2=1;
int m=strlen(s1);
int n=strlen(s2);
int len1=0,len2=0;
if(!f1&&!f2) //两数均为非负数
{
for(int i=m-1;i>=0;i--)//字符数组转换为整形数组
{
a[len1++]=s1[i]-'0';
}
for(int i=n-1;i>=0;i--)
{
b[len2++]=s2[i]-'0';
}
for(int i=0;i9)//考虑到下一位进1之后可能又大于10,所以用while一直进位到不能再进位
{
c[i]-=10;
c[i+1]++;
}
}
if(c[max(len1,len2)])//判断两数相加之后位数增多的情况,比如999+1,如果没有这一步,那么进行下一步的输出c[i],这样会少一位,少了1000中的1
printf("%d",c[max(len1,len2)]);
for(int i=max(len1,len2)-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
else if(f1==1&&f2==1)//两数均为负数,同上一种情况,输出前加上负号即可
{
for(int i=m-1;i>0;i--)
{
a[len1++]=s1[i]-'0';
}
for(int i=n-1;i>0;i--)
{
b[len2++]=s2[i]-'0';
}
for(int i=0;i9)
{
c[i]-=10;
c[i+1]++;
}
}
printf("-");
if(c[max(len1,len2)])
printf("%d",c[max(len1,len2)]);
for(int i=max(len1,len2)-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
else//一正一负,这里分两种情况讨论,一种是这两个数的位数相等,另一种是位数不等。
{
if(f1==1)//字符数组转换为整形数组
{
for(int i=m-1;i>0;i--)
{
a[len1++]=s1[i]-'0';
}
for(int i=n-1;i>=0;i--)
{
b[len2++]=s2[i]-'0';
}
}
if(f2==1)//同上
{
for(int i=m-1;i>=0;i--)
{
a[len1++]=s1[i]-'0';
}
for(int i=n-1;i>0;i--)
{
b[len2++]=s2[i]-'0';
}
}
int maxx=max(len1,len2);
int flag=0;
if(len1==len2) flag=1;
if(flag)//位数相等时,不考虑负号,用较大数减较小数,再根据a和b的正负判断即可
{
int maxxx=0;
for(int i=len1-1;i>=0;i--)//判断这两个位数相等的数谁大谁小,如果相等,直接输出0
{
if(a[i]>b[i])
{
maxxx=1;
break;
}
if(b[i]>a[i])
{
maxxx=2;
break;
}
}
if(maxxx==0)//两数相等,输出0
{
printf("0\n");
return 0;
}
if(maxxx==1)//a大于b时
{
for(int i=0;ia[i])
{
c[i]+=a[i]+10-b[i];
for(int j=i+1;j=0;i--)
{
if(c[i]||i<=h)
{
printf("%d",c[i]);
h=i;
}
}
}
if(f2==1)//b为负数
{
for(int i=maxx-1;i>=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
}
}
if(maxxx==2)//b大于a时
{
for(int i=0;ib[i])
{
c[i]+=b[i]+10-a[i];
for(int j=i+1;j=0;i--)
{
if(c[i]||i<=h)
{
printf("%d",c[i]);
h=i;
}
}
}
if(f1==1)//a为负数
{
for(int i=maxx-1;i>=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
}
}
}
else//位数不相等,不考虑负号,位数长的一定比位数短的数大,直接用较大数减较小数,再根据a和b的正负情况判断即可
{
if(maxx==len1)//如果a的位数长
{
for(int i=0;ia[i])
{
c[i]+=a[i]+10-b[i];
for(int j=i+1;j=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
else//a为负数
{
printf("-");
for(int i=maxx-1;i>=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
}
}
if(maxx==len2)//b的位数大
{
for(int i=0;ib[i])
{
c[i]+=b[i]+10-a[i];
for(int j=i+1;j=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
else//b为负数
{
printf("-");
for(int i=maxx-1;i>=0;i--)
{
if(c[i]||i<=h)
{
h=i;
printf("%d",c[i]);
}
}
}
}
printf("\n");
}
}
return 0;
}
后来看别人写的,顿时发现没那么复杂,100+就搞定了,甚至有的70+就弄出来了,emmmm,备受打击
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e4+10;
int ans[maxn];
int ra[maxn];
int rb[maxn];
void bigadd(string a,string b)//a+b
{
int l1=a.length();
int l2=b.length();
for(int i=0;i9)
{
ans[i]-=10;
ans[i+1]++;
}
}
if(ans[max(l1,l2)])
printf("%d",ans[max(l1,l2)]);
for(int i=max(l1,l2)-1;i>=0;i--)
printf("%d",ans[i]);
puts("");
}
void bigsub(string a,string b)//a-b
{
int l1=a.length();
int l2=b.length();
for(int i=0;ira[i])
{
ans[i]+=ra[i]+10-rb[i];
for(int j=i+1;j=0;i--)
{
if(ans[i]||ib;
return a.length()>b.length();
}
int main()
{
string a,b;
int f1=0,f2=0;
int l1=a.length();
int l2=b.length();
cin>>a>>b;
if(a[0]=='-') f1=1;
if(b[0]=='-') f2=1;
if(!f1&&!f2)
bigadd(a,b);
else if(f1&&f2)
{
string c=a.substr(1,l1-1);
string d=b.substr(1,l2-1);
putchar('-');
bigadd(c,d);
}
else if(f1&&!f2)
{
string c=a.substr(1,l1-1);
if(MAX(c,b)>0)
{
putchar('-');
bigsub(c,b);
}
else
bigsub(b,c);
}
else
{
string d=b.substr(1,l2-1);
if(MAX(d,a))
{
putchar('-');
bigsub(d,a);
}
else
bigsub(a,d);
}
return 0;
}