在只进行加法和减法时,我们可以压八位来加快速度,当有乘法时,压八位会爆int所以我们压四位。 高精度除法压位比较难写,所以我们不选择压位。在程序的前端声明一个变量P来记录压位的位数,M记录压N位时对应的最小的数,即可使程序更容易调试。
const int M=100000000,
P=8;
//输出可以这样写
printf("%*d",P,n[i]);
加减,压八位,输出补零
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=100000000,
P=8; //压位
struct bignum
{
int n[5000],l; //n数组存放每个结构体中的"大数",l记录长度。
bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
void init() //输入过程
{
string s;
cin>>s;
int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10
for(int i=s.length()-1;i>=0;i--) //从s的长度-1开始
{
n[now]+=(s[i]-'0')*c1;
c1*=10;
ct++;
if(ct==P&&i!=0) // 如果i=0了就没有必要now++;
{
now++;
ct=0;
c1=1;
}
}
l=now+1; //l的长度为now+1;
}
void print()
{
printf("%d",n[l-1]);
for(int i=l-2;i>=0;i--)
printf("%0*d",P,n[i]); //补零输出
printf("\n");
}
//-----------------------------------------------
bignum operator + (bignum x) const //重载加号
{
bignum t=*this;
if(x.l>t.l)t.l=x.l;
for(int i=0;i<t.l;i++)
{
t.n[i]+=x.n[i];
if(t.n[i]>=M)
{
t.n[i+1]+=t.n[i]/M;
t.n[i]%=M;
}
}
return t; // 注意:将t的值返回
}
//------------------------------------------------
bool operator < (bignum x) const //重载小于号
{
bignum t=*this;
if(t.l!=x.l)return t.l<x.l;
for(int i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
}
return 0;
}
bignum operator -(bignum x) const //重载减号
{
bignum t=*this;
if(t<x){printf("-");swap(t,x);}
int jie =0;
for(int i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
while(t.n[i]<0)
{
t.n[i]+=M;
jie++;
}
t.n[i+1]-=jie;
jie=0;
}
while(!t.n[t.l-1] && t.l>1)t.l--; // 相减后有可能出现前面有0的情况,所以t.l--;
return t;
}
//----------------------------------------------
}a,b,c;
int main()
{
a.init(); //读入字符串a和b
b.init();
c=a+b;
c.print();
c=a-b;
c.print();
c=a*b;
c.print();
return 0;
}
加减乘,压四位,输出补零
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=10000,
P=4; //压位
struct bignum
{
int n[5000],l; //n数组存放每个结构体中的"大数",l记录长度。
bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
void init() //输入过程
{
string s;
cin>>s;
int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10
for(int i=s.length()-1;i>=0;i--) //从s的长度-1开始
{
n[now]+=(s[i]-'0')*c1;
c1*=10;
ct++;
if(ct==P&&i!=0) // 如果i=0了就没有必要now++;
{
now++;
ct=0;
c1=1;
}
}
l=now+1; //l的长度为now+1;
}
void print()
{
printf("%d",n[l-1]);
for(int i=l-2;i>=0;i--)
printf("%0*d",P,n[i]); //补零输出
printf("\n");
}
//-----------------------------------------------
bignum operator + (bignum x) const //重载加号
{
bignum t=*this;
if(x.l>t.l)t.l=x.l;
for(int i=0;i<t.l;i++)
{
t.n[i]+=x.n[i];
if(t.n[i]>=M)
{
t.n[i+1]+=t.n[i]/M;
t.n[i]%=M;
}
}
return t; // 注意:将t的值返回
}
//------------------------------------------------
bool operator < (bignum x) const //重载小于号
{
bignum t=*this;
if(t.l!=x.l)return t.l<x.l;
for(int i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
}
return 0;
}
bignum operator -(bignum x) const //重载减号
{
bignum t=*this;
if(t<x){printf("-");swap(t,x);}
int jie =0;
for(int i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
while(t.n[i]<0)
{
t.n[i]+=M;
jie++;
}
t.n[i+1]-=jie;
jie=0;
}
while(!t.n[t.l-1] && t.l>1)t.l--; // 相减后有可能出现前面有0的情况,所以t.l--;
return t;
}
//------------------------------------------------
bignum operator *(bignum x) const //重载乘号
{
bignum t=*this,tep;
tep.l=t.l+x.l-1;
for(int i=0;i<t.l;i++)
for(int j=0;j<x.l;j++)
{
tep.n[i+j]+=t.n[i]*x.n[j];
if(tep.n[i+j]>=M)
{
tep.n[i+j+1]+=tep.n[i+j]/M;
tep.n[i+j]%=M;
}
}
while(tep.n[tep.l])
{
tep.n[tep.l+1]+=tep.n[tep.l]/M;
tep.n[tep.l++]%=M;
}
return tep;
}
//-----------------------------------------
}a,b,c;
int main()
{
a.init(); //读入字符串a和b
b.init();
c=a+b;
c.print();
c=a-b;
c.print();
c=a*b;
c.print();
return 0;
}
加减乘除,不压位
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=10,
P=1; //压位
struct bignum
{
int n[5000],l; //n数组存放每个结构体中的"大数",l记录长度。
bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
void init() //输入过程
{
string s;
cin>>s;
int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10
for(int i=s.length()-1;i>=0;i--) //从s的长度-1开始
{
n[now]+=(s[i]-'0')*c1;
c1*=10;
ct++;
if(ct==P&&i!=0) // 如果i=0了就没有必要now++;
{
now++;
ct=0;
c1=1;
}
}
l=now+1; //l的长度为now+1;
}
void print()
{
printf("%d",n[l-1]);
for(int i=l-2;i>=0;i--)
printf("%0*d",P,n[i]); //补零输出
printf("\n");
}
//-----------------------------------------------
bignum operator + (bignum x) const //重载加号
{
bignum t=*this;
if(x.l>t.l)t.l=x.l;
for(int i=0;i<t.l;i++)
{
t.n[i]+=x.n[i];
if(t.n[i]>=M)
{
t.n[i+1]+=t.n[i]/M;
t.n[i]%=M;
}
}
return t; // 注意:将t的值返回
}
//------------------------------------------------
bool operator < (bignum x) const //重载小于号
{
bignum t=*this;
if(t.l!=x.l)return t.l<x.l;
for(int i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
}
return 0;
}
bignum operator -(bignum x) const //重载减号
{
bignum t=*this;
if(t<x){printf("-");swap(t,x);}
int jie =0;
for(int i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
while(t.n[i]<0)
{
t.n[i]+=M;
jie++;
}
t.n[i+1]-=jie;
jie=0;
}
while(!t.n[t.l-1] && t.l>1)t.l--; // 相减后有可能出现前面有0的情况,所以t.l--;
return t;
}
//------------------------------------------------
bignum operator *(bignum x) const //重载乘号
{
bignum t=*this,tep;
tep.l=t.l+x.l-1;
for(int i=0;i<t.l;i++)
for(int j=0;j<x.l;j++)
{
tep.n[i+j]+=t.n[i]*x.n[j];
if(tep.n[i+j]>=M)
{
tep.n[i+j+1]+=tep.n[i+j]/M;
tep.n[i+j]%=M;
}
}
while(tep.n[tep.l])
{
tep.n[tep.l+1]+=tep.n[tep.l]/M;
tep.n[tep.l++]%=M;
}
return tep;
}
//-----------------------------------------
void Add(int x){if(x||l)n[l++]=x;} //除法
void Re(){reverse(n,n+l);} //高精度除以高精度
bignum operator /(const bignum &x)const
{
bignum t=*this,r,y;
y.l=0,r.l=t.l;
for(int i=t.l-1;i>=0;--i)
{
y.Add(t.n[i]);
y.Re();
while(!(y<x))y=y-x,r.n[i]++;
while(!y.n[y.l-1] && y.l>=1)--y.l;
y.Re();
}
while(!r.n[r.l-1] && r.l>1)--r.l;
return r;
}bignum operator /(const int &x)const //高精度除以单精度
{
bignum t=*this,r;
r.l=t.l;
int tmp=0;
for(int i=t.l-1;i>=0;--i)
{
tmp+=t.n[i];
if(tmp>=x)
r.n[i]+=tmp/x,tmp%=x;
tmp*=M;
}
while(!r.n[r.l-1] && r.l>1)--r.l;
return r;
}
}a,b,c;
int main()
{
a.init(); //读入字符串a和b
b.init();
c=a+b;
c.print();
c=a-b;
c.print();
c=a*b;
c.print();
c=a/b;
c.print();
return 0;
}
最后剽窃一个功能更丰富的- -
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int M=10,P=1;
struct BigNum
{
int n[5000],l,Y;
BigNum(){l=1,memset(n,0,sizeof(n));}
//----------------------------------
void init()
{
string s;
cin>>s;
int now=0,ct=0,c1=1;
for(int i=s.length()-1;i>=0;i--)
{
n[now]+=(s[i]-'0')*c1;
c1*=10;
ct++;
if(ct==P&&i!=0)
{
now++;
c1=1;
ct=0;
}
}
l=now+1;
}
//-----------------------------------
void print()
{
printf("%d",n[l-1]);
for(int i=l-2;i>=0;i--)
printf("%0*d",P,n[i]);
printf("\n");
}
//------------------------------------
BigNum operator +(BigNum x)const
{
BigNum t=*this;
if(x.l>t.l)t.l=x.l;
for(int i=0;i<t.l;i++)
{
t.n[i]+=x.n[i];
if(t.n[i]>=M)
{
t.n[i+1]+=t.n[i]/M;
t.n[i]%=M;
}
}
while(t.n[t.l])
{
t.n[t.l+1]+=t.n[t.l]/M;
t.n[t.l++]%=M;
}
return t;
}
//--------------------------------------
bool operator < (BigNum x) const
{
BigNum t=*this;
if(t.l!=x.l)return t.l<x.l;
for(int i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i])return t.n[i]<x.n[i];
}
return 0;
}
BigNum operator -(BigNum x)const
{
BigNum t=*this;
if(t<x){printf("-");swap(t,x);}
for(int i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
if(t.n[i]<0)
{
t.n[i]+=M;
--t.n[i+1];
}
}
while(!t.n[t.l-1]&&t.l>1)t.l--;
return t;
}
//--------------------------------------------
BigNum operator * (BigNum x) const
{
BigNum c,t=*this;
c.l=t.l+x.l-1;
for(int i=0;i<t.l;i++)
for(int j=0;j<x.l;j++)
{
c.n[i+j]+=t.n[i]*x.n[j];
if(c.n[i+j]>=M)
{
c.n[i+j+1]+=c.n[i+j]/M;
c.n[i+j]%=M;
}
}
while(c.n[c.l])
{
c.n[c.l+1]+=c.n[c.l]/M;
c.n[c.l++]%=M;
}
return c;
}
BigNum operator * (int x) const
{
BigNum t=*this,c;
c.l=t.l;
for(int i=0;i<t.l;i++)
{
c.n[i]+=t.n[i]*x;
if(c.n[i]>=M)
{
c.n[i+1]+=c.n[i]/M;
c.n[i]%=M;
}
}
while(c.n[c.l])
{
c.n[c.l+1]+=c.n[c.l]/M;
c.n[c.l++]%=M;
}
return c;
}
//--------------------------------------------
void Add(int x){if(x||l)n[l++]=x;}
void Re(){reverse(n,n+l);}
BigNum operator /(const BigNum &x)const
{
BigNum t=*this,r,y;
y.l=0,r.l=t.l;
for(int i=t.l-1;i>=0;--i)
{
y.Add(t.n[i]);
y.Re();
while(!(y<x))y=y-x,r.n[i]++;
while(!y.n[y.l-1] && y.l>1)--y.l;
y.Re();
}
while(!r.n[r.l-1] && r.l>1)--r.l;
return r;
}
BigNum operator /(const int &x)const
{
BigNum t=*this,r;
r.l=t.l;
int tmp=0;
for(int i=t.l-1;i>=0;--i)
{
tmp+=t.n[i];
if(tmp>=x)
r.n[i]+=tmp/x,tmp%=x;
tmp*=M;
}
while(!r.n[r.l-1] && r.l>1)--r.l;
return r;
}
//---------------------------------------
}a,b,c;
int main()
{
a.init();
b.init();
c=a+b;
c.print();
c=a-b;
c.print();
c=a*b;
c.print();
c=a/b;
c.print();
return 0;
}