【模板】压位高精

摘自大佬博客

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int power=1;//每次运算的位数为10的power次方 
const int base=10;//10的power次方 
const int N=1001;
char a[N],b[N];
struct Bignum{
	int a[N];
	Bignum(){memset(a,0,sizeof(a));}
	Bignum(char *s)//初始化数组,转化为高精度数 
	{
		memset(a,0,sizeof(a));
		int len=strlen(s);
		a[0]=(len+power-1)/power;
		for(int i=0,t=0,w;i<len;w*=10,++i)
		{
			if(i%power==0){w=1;++t;}
			a[t]+=w*(s[i]-'0');
		}
	}
	void add(int k){if(k||a[0])a[++a[0]]=k;}//在数的末尾添加一个数 
	void re(){reverse(a+1,a+a[0]+1);}//把数反过来
	void print()
	{
		printf("%d",a[a[0]]);//先打印最高位
		for(int i=a[0]-1;i;i--)
		    printf("%0*d",power,a[i]);//输出power位
		printf("\n"); 
	} 
}p,q,ans;
bool operator<(const Bignum&p,const Bignum&q)//判断小于关系 
{
	if(p.a[0]<q.a[0])return true;
	if(p.a[0]>q.a[0])return false;
	for(int i=p.a[0];i;i--)
	    if(p.a[i]!=q.a[i])return p.a[i]<q.a[i];
	return false;
}
Bignum operator +(const Bignum&p,const Bignum&q)
{
	Bignum c;
	c.a[0]=max(p.a[0],q.a[0]);
	for(int i=1;i<=c.a[0];i++)
	{
		c.a[i]+=p.a[i]+q.a[i];
		c.a[i+1]+=c.a[i]/base;
		c.a[i]%=base;
	}
	if(c.a[c.a[0]+1])++c.a[0];
	return c;
}
Bignum operator -(const Bignum&p,const Bignum&q)
{
	Bignum c=p;
	for(int i=1;i<=c.a[0];i++)
	{
		c.a[i]-=q.a[i];
		if(c.a[i]<0){c.a[i]+=base;--c.a[i+1];}
	}
	while(c.a[0]>0&&!c.a[c.a[0]])--c.a[0];
	return c;
}
Bignum operator *(const Bignum&p,const Bignum&q)
{
	Bignum c;
	c.a[0]=p.a[0]+q.a[0]-1;
	for(int i=1;i<=p.a[0];i++)
	    for(int j=1;j<=q.a[0];j++)
	    {
	    	c.a[i+j-1]+=p.a[i]*q.a[j];
	    	c.a[i+j]+=c.a[i+j-1]/base;
	    	c.a[i+j-1]%=base;
		}
	if(c.a[c.a[0]+1])++c.a[0];
	return c;
}
Bignum operator /(const Bignum&p,const Bignum&q)
{
	Bignum x,y;
	for(int i=p.a[0];i>=1;i--)//从最高位开始取数 
	{
		y.add(p.a[i]);//把数添加到最低位,高位在前,低位在后
		y.re();//变成低位在前高位在后
		while(!(y<q))//大于等于除数 
		    y=y-q,++x.a[i];//看能减去几个除数 
		y.re();
	}
	x.a[0]=p.a[0];
	while(x.a[0]>0&&!x.a[x.a[0]])--x.a[0];
	return x;
}
int main()
{
	scanf("%s",a);
	scanf("%s",b);
	reverse(a,a+strlen(a));
	reverse(b,b+strlen(b));
	p=Bignum(a);q=Bignum(b);
	ans=p+q;
	ans.print();
	ans=p-q;
	ans.print();
	ans=p*q;
	ans.print();
	ans=p/q;
	ans.print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/83352560