不走程序,直接上板子。
第一个板子压四位,支持带符号的加减乘。
第二个板子压九位,支持不带符号的四则运算和取模。
都封装了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct intX
{
static const int M=600;
int xb[M+5];
intX& operator=(const char* c)
{
memset(xb,0,sizeof(xb));
int n=strlen(c),j=1,k=1;
for(int i=1;i<n;i++,k*=10)
{
if(k==10000) j++,k=1;
xb[j]+=k*(c[n-i]-'0');
}
xb[0]=j,xb[M]=c[0]-'0';
return *this;
}
intX& operator=(int a)
{
char s[25];
sprintf(s+1,"%d",a);
if(a<0) s[0]='1'; else s[0]='0';
return *this=s;
}
intX() {memset(xb,0,sizeof(xb)); xb[0]=1;}
intX(int n) {*this=n;}
bool operator>(const intX &b) const
{
if(xb[M]!=b.xb[M]) return xb[M]<b.xb[M];
if(xb[0]!=b.xb[0]) return xb[M]?xb[0]<b.xb[0]:xb[0]>b.xb[0];
for(int i=xb[0];i>0;i--)
if(xb[i]!=b.xb[i]) return xb[M]?xb[i]<b.xb[i]:xb[i]>b.xb[i];
return false;
}
bool operator<(const intX &b) const {return b>*this;}
bool operator<=(const intX &b) const {return !(*this>b);}
bool operator>=(const intX &b) const {return !(b>*this);}
bool operator!=(const intX &b) const {return b>*this||*this>b;}
bool operator==(const intX &b) const {return !(b>*this)&&!(*this>b);}
intX operator+(const intX &b) const
{
intX c,d=b,e=*this;
if(xb[M]^b.xb[M])
{
e.xb[M]=d.xb[M]=0;
c=e>d?e-d:d-e;
if((e>d&&xb[M]) || (e<d&&b.xb[M])) c.xb[M]=1;
return c;
}
c.xb[0]=max(xb[0],b.xb[0]), c.xb[M]=xb[M];
for(int i=1;i<=c.xb[0];i++)
{
c.xb[i]+=xb[i]+b.xb[i];
if(c.xb[i]>9999) c.xb[i]-=10000, c.xb[i+1]++;
}
if(c.xb[c.xb[0]+1]>0) c.xb[0]++;
return c;
}
intX operator-(const intX &b) const
{
intX c,d=b,e=*this;
if(e<0 && d<0) {d.xb[M]=e.xb[M]=0; return d-e;}
else if(d<0) {d.xb[M]=0; return d+e;}
else if(e<0) {d.xb[M]=1; return d+e;}
else if(e<d) {c=d-e; c.xb[M]=1; return c;}
c.xb[0]=xb[0];
for(int i=1;i<=c.xb[0];i++)
{
c.xb[i]+=xb[i]-b.xb[i];
if(c.xb[i]<0) c.xb[i]+=10000, c.xb[i+1]--;
}
while(!c.xb[c.xb[0]]&&c.xb[0]>1) c.xb[0]--;
return c;
}
intX& operator+=(const intX &b) {return *this=*this+b;}
intX& operator-=(const intX &b) {return *this=*this-b;}
intX operator*(const intX &b) const
{
intX c;
c.xb[0]=xb[0]+b.xb[0]+1;
for(int i=1;i<=xb[0];i++)
for(int j=1;j<=b.xb[0];j++)
c.xb[i+j-1]+=xb[i]*b.xb[j],
c.xb[i+j]+=c.xb[i+j-1]/10000,
c.xb[i+j-1]%=10000;
while(!c.xb[c.xb[0]] && c.xb[0]>1) c.xb[0]--;
if(*this!=0 && b!=0) c.xb[M]=xb[M]^b.xb[M];
return c;
}
intX operator*=(const intX &b) {return *this=*this*b;}
void readX(intX &b)
{
char s[2*M]; scanf("%s",s+1);
if(s[1]=='-') s[1]='0',s[0]='1'; else s[0]='0';
b=s;
}
void writeX()
{
if(xb[M]) printf("-");
printf("%d",xb[xb[0]]);
for(int i=xb[0]-1;i>0;i--)
printf("%04d",xb[i]);
}
};
int main()
{
intX a,b;
a.readX(a),b.readX(b);
(a+b).writeX();
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int LEN=10000+1,BIT=9;
struct intX
{
static const int MOD=1000000000;
long long s[LEN];
bool flag;
intX() {memset(s,0,sizeof(s)); s[0]=flag=1;}
intX& operator=(const char *num)
{
int l=strlen(num);
memset(s,0,sizeof(s));
for(int i=l-1;i>=0;i-=BIT)
{
++s[0];
long long w=1;
for(int j=i;j>i-BIT && j>=0;j--)
s[s[0]]+=(num[j]^48)*w, w=(w<<1)+(w<<3);
}
return *this;
}
intX& operator=(int num)
{
char a[LEN];
sprintf(a,"%d",num);
return *this=a;
}
intX(int n) {*this = n;}
intX(const char *n) {*this = n;}
bool operator>(const intX &a) const
{
if(s[0]!=a.s[0]) return s[0]>a.s[0];
int up=max(s[0],a.s[0]);
for(int i=0;i<up;i++)
if(s[up-i]!=a.s[up-i]) return s[up-i]>a.s[up-i];
return false;
}
bool operator<(const intX &a) const {return a>*this;}
bool operator<=(const intX &a) const {return !(*this>a);}
bool operator>=(const intX &a) const {return !(a>*this);}
bool operator!=(const intX &a) const {return a>*this||*this>a;}
bool operator==(const intX &a) const {return !(a>*this)&&!(*this>a);}
intX operator+(const intX &a) const
{
intX c;
int x=0;
c.s[0]=max(a.s[0],s[0])+1;
for(int i=1;i<=c.s[0];i++)
c.s[i]=a.s[i]+s[i]+x,
x=c.s[i]/MOD,
c.s[i]%=MOD;
while(c.s[c.s[0]]==0 && c.s[0]>1) c.s[0]--;
return c;
}
intX& operator+=(const intX &a) {return *this=*this+a;}
intX operator-(const intX &a) const
{
intX c;
c.s[0]=max(a.s[0],s[0])+1;
if(*this<a) c.flag=false;
for(int i=1;i<=c.s[0];i++)
{
if(c.flag) c.s[i]+=s[i]-a.s[i];
else c.s[i]+=a.s[i]-s[i];
if(c.s[i]<0) c.s[i]+=MOD, c.s[i+1]--;
}
while(c.s[c.s[0]]==0 && c.s[0]>1) c.s[0]--;
return c;
}
intX& operator-=(const intX &a) {return *this=*this-a;}
intX operator*(const intX &a) const
{
intX c;
c.s[0]=s[0]+a.s[0];
for(int i=1;i<=s[0];i++)
{
int x=0;
for(int j=1;j<=a.s[0];j++)
c.s[i+j-1]+=s[i]*a.s[j]+x,
x=c.s[i+j-1]/MOD,
c.s[i+j-1]%=MOD;
c.s[i+a.s[0]]=x;
}
while(c.s[c.s[0]]>0) c.s[0]++;
while(c.s[c.s[0]]==0 && c.s[0]>1) c.s[0]--;
return c;
}
intX& operator*=(const intX &a) {return *this=*this*a;}
intX operator<<(const int &num)
{
s[0]++;
for(int i=1;i<=s[0];i++)
{
s[i]<<=num;
if(s[i-1]>=MOD) s[i-1]-=MOD, ++s[i];
}
while(s[s[0]]==0 && s[0]>1) s[0]--;
return *this;
}
intX operator>>(const int &num)
{
for(int i=s[0];i>=1;i--)
{
if((s[i]&1) && i>1) s[i-1]+=MOD;
s[i]>>=num;
}
while(s[s[0]]==0 && s[0]>1) s[0]--;
return *this;
}
intX operator/(const intX &k) const
{
intX c=*this,tmp,lt,a;
a=k;
tmp.s[1]=1;
while(c>=a) a=a<<1,tmp=tmp<<1;
while(tmp.s[0]>1 || tmp.s[1])
{
if(c>=a) c-=a, lt+=tmp;
a=a>>1, tmp=tmp>>1;
}
c=lt;
while(c.s[c.s[0]]==0 && c.s[0]>1) c.s[0]--;
if(c.s[0]<1) c.s[c.s[0]=1]=0;
return c;
}
intX& operator/=(const intX &a) {return *this=*this/a;}
intX operator%(const intX &a) const {return *this-*this/a*a;}
intX& operator%=(const intX &a) {return *this=*this%a;}
};
ostream& operator<<(ostream &out,const intX &a)
{
if(!a.flag) putchar('-');
printf("%lld",a.s[a.s[0]]);
for(int i=a.s[0]-1;i>=1;i--)
printf("%0*lld",BIT,a.s[i]);
return out;
}
istream& operator>>(istream &in,intX &a)
{
char str[LEN];
scanf("%s",str);
a=str;
return in;
}