给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
写了很久,唉,实力太弱了,主要是细节有点多。我先写了俩函数,一个是正数加法的,一个是正数减法的,然后就是判断情况,分为正正,负负,正负,负正。最后还有就是全0的情况,还有前面有零的情况。中间还写了一个判断俩字符串大小的函数,简单来说,就这些吧。我函数名字就是拼音,还是很好认的、晚安:附代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int jiafa(char *a,int lena,char *b, int lenb,char *c)
{
for(int i=0;i<lena;i++)a[i]=a[i]-'0';
for(int j=0;j<lenb;j++)b[j]=b[j]-'0';
int num;
int flag=0;
int k=0;
for(int i=0;i<max(lena,lenb);i++)
{
num=a[i]+b[i]+flag;
if(num>9)
{
c[k]=num-10;
flag=1;
}
else {
c[k]=num;
flag=0;
}
k++;
}
if(flag==1)
c[k++]=1;
for(int i=0;i<k;i++)
c[i]=c[i]+'0';
return k;
}
int jianfa(char *a,int lena,char *b, int lenb,char *c)
{
for(int i=0;i<lena;i++)a[i]=a[i]-'0';
for(int j=0;j<lenb;j++)b[j]=b[j]-'0';
int flag=0;
int k=0;
int num;
for(int i=0;i<lena;i++)
{
num=a[i]-b[i]-flag;
if(num<0)
{
c[k]=num+10;
flag=1;
}
else {
c[k]=num;
flag=0;
}
k++;
}
for(int i=0;i<k;i++)
c[i]=c[i]+'0';
return k;
}
int bijiao(char *a,int lena,char *b,int lenb)
{
int flag=0;
if(lena>lenb)
flag=1;
else if(lena==lenb)
{
for(int i=lena-1;i>=0;i--)
{
if(a[i]>b[i])
{
flag=1;
break;
}
else {
flag=0;
break;
}
}
}
return flag;
}
int panling(char *a,int lena)
{
int flag=0;
for(int i=0;i<lena;i++)
{
if(a[i]!='0')
{
flag=1;
break;
}
}
return flag;
}
int chuling(char *a,int lena)
{
for(int i=0;i<lena;i++)
{
if(a[i]=='0')
{
for(int j=i;j<lena;j++)
{
a[j]=a[j+1];
}
i--;
lena--;
}
else break;
}
return lena;
}
int main()
{
int n;
#ifdef LOCAL
freopen("D:/input.txt", "r", stdin);
#endif
char a[10500];
char b[10500];
char c[20500];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",a);
scanf("%s",b);
int flaga=0, flagb=0;
int lena=strlen(a);
int lenb=strlen(b);
if(a[0]=='-')flaga=1;
if(b[0]=='-')flagb=1;
int k;
int flag=0;
if(flaga==1&&flagb==1)
{
reverse(a+1,a+lena);
reverse(b+1,b+lenb);
k=jiafa(a+1,lena-1,b+1,lenb-1,c);
flag=1;
}
if(flaga==0&&flagb==0)
{
reverse(a,a+lena);
reverse(b,b+lenb);
k=jiafa(a,lena,b,lenb,c);
}
if(flaga==0&&flagb==1)
{
reverse(a,a+lena);
reverse(b+1,b+lenb);
if(bijiao(a,lena,b+1,lenb-1)==1)
{
k=jianfa(a,lena,b+1,lenb-1,c);
}
else {
k=jianfa(b+1,lenb-1,a,lena,c);
flag=1;
}
}
if(flaga==1&&flagb==0)
{
reverse(a+1,a+lena);
reverse(b,b+lenb);
if(bijiao(a+1,lena-1,b,lenb)==1)
{
k=jianfa(a+1,lena-1 ,b,lenb,c);
flag=1;
}
else {
k=jianfa(b,lenb,a+1,lena-1,c);
}
}
reverse(c,c+k);
k=chuling(c,k);
if(panling(c,k)==0)
cout<<'0';
else {
if(flag==1)
cout<<'-';
for(int i=0;i<k;i++)
cout<<c[i];
}
return 0;
}