大数类
在写P1009时需要大数运算,就顺便把整个大数类都写出来了,因为P1009中用不到某些功能(比如重载运算符号,减法,除法等),所以就没写哪些功能,等到以后需要用的的时候在写上并更新此处的代码
Code
class bigint
{
//静态参数
static const int Max=1000;
//友元函数
friend bigint add(bigint a,bigint b);
friend bigint multi(bigint a,bigint b);
public:
int size;
//构造函数
bigint();
bigint(int x);
bigint(long long int x);
//类方法
void assign(long long int x);
void print();
private:
int num[Max];
};
bigint::bigint()
{
size=1;
for(int i=0;i<Max;i++)
{
num[i]=0;
}
}
bigint::bigint(int x)
{
for(int i=0;i<Max;i++)
{
num[i]=0;
}
if(x==0)
{
size=1;
return;
}
int p=1;
size=0;
while(x!=0)
{
num[p]=x%10000;
x/=10000;
p++;
size++;
}
}
bigint::bigint(long long int x)
{
for(int i=0;i<Max;i++)
{
num[i]=0;
}
if(x==0)
{
size=1;
return;
}
int p=1;
size=0;
while(x!=0)
{
num[p]=x%10000;
x/=10000;
p++;
size++;
}
}
void bigint::assign(long long int x)
{
int p=1;
size=0;
while(x!=0)
{
num[p]=x%10000;
x/=10000;
p++;
size++;
}
}
void bigint::print()
{
for(int p=size;p>=1;p--)
{
if(num[p]<10&&p!=size)cout<<'0';
if(num[p]<100&&p!=size)cout<<'0';
if(num[p]<1000&&p!=size)cout<<'0';
cout<<num[p];
}
}
bigint add(bigint a,bigint b)
{
bigint c;
int p=1;
while(p<=a.size||p<=b.size)
{
int x=a.num[p]+b.num[p];
c.num[p+1]+=x/10000;
c.num[p]+=x%10000;
p++;
}
c.size=max(a.size,b.size);
if(a.size==b.size&&c.num[c.size+1]!=0)
{
c.size++;
}
return c;
}
bigint multi(bigint a,bigint b)
{
bigint c;
for(int i=a.size;i>=1;i--)
{
for(int j=b.size;j>=1;j--)
{
int x=a.num[i]*b.num[j];
c.num[i+j-1]+=x%10000;
c.num[i+j]+=x/10000;
}
}
c.size=a.size+b.size-1;
if(c.num[a.size+b.size]!=0)
{
c.size++;
}
return c;
}```