C++ BigInt模板手打
参考邝斌的模板
模拟整数,大整数对象的数据成员应该有两个
1:存放数字的数组,(常用字符类型存放1位数字,这里用int类型存放4位数字(当然也可以8位,不过参数需要用longlong才能保证乘法不超过int),相同长度的整数内存空间相同)
2:len 用以记录模拟数组的长度,方便运算和不输出前导0;
同事有两个静态常数据成员 static const int mod=10000 以及 static const int Dlen=4;
模拟大数运算是从低位往高位运算,所以在读取字符串存放在数组的时候要把高位的字符放在大数的低位数组上,运算时就能从0开始计算;输出的时候也从高位开始输出
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct BigInt
{
const static int mod=10000;
const static int Dlen=4;
int a[600],len;
BigInt(int v=0)
{
memset(a,0,sizeof(a));
len=0;
do
{
a[len++]=v%mod;
v/=mod;
}while(v);
}
BigInt(char s[])
{
memset(a,0,sizeof(a));
int L=strlen(s);
len=(L-1)/Dlen+1;
int index=0;
for(int i=L-1;i>=0;i-=Dlen)
{
int t=0;
int 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;
}
}
BigInt operator +(const BigInt &rhs)
{
BigInt ret;
ret.len=max(len,rhs.len);
for(int i=0;i<=ret.len;i++)
ret.a[i] = 0;
for(int i=0;i<ret.len;i++)
{
ret.a[i]+=(i<len?a[i]:0)+(i<rhs.len?rhs.a[i]:0);
ret.a[i+1]=ret.a[i]/mod;
ret.a[i]%=mod;
}
if(ret.a[ret.len]>0) ret.len++;
return ret;
}
BigInt operator *(const BigInt &rhs)
{
BigInt ret;
ret.len=len+rhs.len;
for(int i=0;i<len;i++)
{
int up=0;
for(int j=0;j<rhs.len;j++)
{
int tmp=a[i]*a[j]+a[i+j]+up;
a[i+j]=tmp%mod;
up=tmp/mod;
}
if(up!=0)
{
a[i+rhs.len]=up;
}
}
while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--;
return ret;
}
void print()
{
printf("%d",a[len-1]);
for(int i=len-2;i>=0;--i)
{
printf("%04d",a[i]);
}
printf("\n");
}
};
int main()
{
char s1[200],s2[200];
cin>>s1>>s2;
BigInt a(s1),b(s2);
a.print();
b.print();
(a+b).print();
return 0;
}