SOL:小学数学规则,模拟即可。
第一个常见的板子 (通用性较小) 5ms
#include<cstdio>
#include<cstring>
#define rep(i,n) for(i=1;i<=n;i++)
using namespace std;
const int maxn = 1000 + 10;
char str1[maxn],str2[maxn],str3[maxn];
int i,len1,len2,j,T;
int a[maxn],b[maxn],c[maxn];
int main()
{
scanf("%d",&T);
rep(j,T)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s%s%s",str1,str2,str3);
a[0]=strlen(str1);
rep(i,a[0]) a[i]=str1[a[0]-i]-'0';
b[0]=strlen(str2);
rep(i,b[0]) b[i]=str2[b[0]-i]-'0';
c[0]=strlen(str3);
rep(i,c[0]) c[i]=str3[c[0]-i]-'0';
len1=(a[0]>b[0]?a[0]:b[0]);
rep(i,len1)
{
a[i]+=b[i];
a[i+1]+=a[i]/10;
a[i]%=10;
}
len1++;
while((a[len1]==0)&&(len1>1)) len1--;
/*printf("len1=%d\n",len1);
printf("a[0]=%d a[1]=%d\n",a[0],a[1]);
printf("b[0]=%d b[1]=%d\n",b[0],b[1]);
printf("c[0]=%d c[1]=%d\n",c[0],c[1]);
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);*/
len2=(len1>c[0]?len1:c[0]);
rep(i,len2)
{
a[i]+=c[i];
a[i+1]+=a[i]/10;
a[i]%=10;
}
len2++;
while((a[len2]==0)&&(len2>1)) len2--;
/*printf("len2=%d\n",len2);
printf("a[0]=%d a[1]=%d\n",a[0],a[1]);*/
printf("%s + %s + %s = ",str1,str2,str3);
for(i=len2;i>=1;i--) printf("%d",a[i]);
/*for(i=len1;i>=1;i--) printf("%d",a[i]);*/
printf("\n");
}
return 0;
}
第二个板子 (通用性较广) 14ms
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 9999
#define maxsize 10100
#define DLEN 4
class BigNum
{
private:
int a[10100];
int len;
public:
BigNum(){len=1;memset(a,0,sizeof(a));}
BigNum(const int);
BigNum(const char*);
BigNum(const BigNum &);
BigNum &operator=(const BigNum &);
friend istream& operator>>(istream&,BigNum&);
friend ostream& operator<<(ostream&,BigNum&);
BigNum operator+(const BigNum &)const;
BigNum operator-(const BigNum &)const;
BigNum operator*(const BigNum &)const;
BigNum operator/(const int &)const;
BigNum operator^(const int &)const;
int operator%(const int &)const;
bool operator>(const BigNum &T)const;
bool operator>(const int &t)const;
void print();
};
BigNum :: BigNum(const int b)
{
int c,d=b;
len=0;
memset(a,0,sizeof(a));
while(d>maxn)
{
c=d-(d/(maxn+1))*(maxn+1);
d=d/(maxn+1);
a[len++]=c;
}
a[len++]=d;
}
BigNum :: BigNum(const char *s)
{
int t,k,index,L,i;
memset(a,0,sizeof(a));
L=strlen(s);
len=L/DLEN;
if(L%DLEN) len++;
index=0;
for(i=L-1;i>=0;i-=DLEN)
{
t=0;
k=i-DLEN+1;
if(k<0) k=0;
for(int j=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum :: BigNum(const BigNum &T):len(T.len)
{
int i;
memset(a,0,sizeof(a));
for(i=0;i<len;i++)
a[i]=T.a[i];
}
BigNum & BigNum :: operator=(const BigNum &n)
{
int i;
len=n.len;
memset(a,0,sizeof(a));
for(i=0;i<len;i++)
a[i]=n.a[i];
return *this;
}
istream& operator>>(istream &in,BigNum &b)
{
char ch[maxsize*4];
int i=-1;
in>>ch;
int L=strlen(ch);
int count=0,sum=0;
for(i=L-1;i>=0;)
{
sum=0;
int t=1;
for(int j=0;j<4&&i>=0;j++,i--,t*=10)
{
sum+=(ch[i]-'0')*t;
}
b.a[count]=sum;
count++;
}
b.len=count++;
return in;
}
ostream& operator<<(ostream& out,BigNum& b)
{
int i;
cout<<b.a[b.len-1];
for(i=b.len-2;i>=0;i--)
{
printf("%04d",b.a[i]);
}
return out;
}
BigNum BigNum :: operator+(const BigNum &T)const
{
BigNum t(*this);
int i,big;
big=T.len>len?T.len:len;
for(i=0;i<big;i++)
{
t.a[i]+=T.a[i];
if(t.a[i]>maxn)
{
t.a[i+1]++;
t.a[i]-=maxn+1;
}
}
if(t.a[big]!=0)
t.len=big+1;
else t.len=big;
return t;
}
BigNum BigNum :: operator-(const BigNum &T)const
{
int i,j,big;
bool flag;
BigNum t1,t2;
if(*this>T)
{
t1=*this;
t2=T;
flag=0;
}
else
{
t1=T;
t2=*this;
flag=1;
}
big=t1.len;
for(i=0;i<big;i++)
{
if(t1.a[i]<t2.a[i])
{
j=i+1;
while(t1.a[j]==0)
j++;
t1.a[j--]--;
while(j>i)
t1.a[j--]+=maxn;
t1.a[i]+=maxn+1-t2.a[i];
}
else t1.a[i]-=t2.a[i];
}
t1.len=big;
while(t1.a[len-1]==0&&t1.len>1)
{
t1.len--;
big--;
}
if(flag)
t1.a[big-1]=0-t1.a[big-1];
return t1;
}
BigNum BigNum :: operator*(const BigNum &T)const
{
BigNum ret;
int i,j,up;
int temp,temp1;
for(i=0;i<len;i++)
{
up=0;
for(j=0;j<T.len;j++)
{
temp=a[i]*T.a[j]+ret.a[i+j]+up;
if(temp>maxn)
{
temp1=temp-temp/(maxn+1)*(maxn+1);
up=temp/(maxn+1);
ret.a[i+j]=temp1;
}
else
{
up=0;
ret.a[i+j]=temp;
}
}
if(up!=0)
ret.a[i+j]=up;
}
ret.len=i+j;
while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--;
return ret;
}
BigNum BigNum :: operator/(const int &b)const
{
BigNum ret;
int i,down=0;
for(i=len-1;i>=0;i--)
{
ret.a[i]=(a[i]+down*(maxn+1))/b;
down=a[i]+down*(maxn+1)-ret.a[i]*b;
}
ret.len=len;
while(ret.a[ret.len-1]==0&&ret.len>1)
ret.len--;
return ret;
}
int BigNum :: operator%(const int &b)const
{
int i,d=0;
for(i=len-1;i>=0;i--)
d=((d*(maxn+1))%b+a[i])%b;
return d;
}
BigNum BigNum :: operator^(const int &n)const
{
BigNum t,ret(1);
int i;
if(n<0) exit(-1);
if(n==0) return 1;
if(n==1) return *this;
int m=n;
while(m>1)
{
t=*this;
for(i=1;(i<<1)<=m;i<<=1)
t=t*t;
m-=i;
ret=ret*t;
if(m==1) ret=ret*(*this);
}
return ret;
}
bool BigNum :: operator>(const BigNum &T)const
{
int ln;
if(len>T.len) return true;
else if(len==T.len)
{
ln=len-1;
while(a[ln]==T.a[ln]&&ln>=0)
ln--;
if(ln>=0&&a[ln]>T.a[ln])
return true;
else
return false;
}
else
return false;
}
bool BigNum :: operator>(const int &t)const
{
BigNum b(t);
return *this>b;
}
void BigNum::print()
{
int i;
printf("%d",a[len-1]);
for(i=len-2;i>=0;i--)
printf("%04d",a[i]);
//printf("\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
BigNum A,B,C,Sum;
cin>>A;
cin>>B;
cin>>C;
Sum=A+B;
Sum=Sum+C;
A.print();
printf(" + ");
B.print();
printf(" + ");
C.print();
printf(" = ");
Sum.print();
printf("\n");
}
return 0;
}