『模板 高精度计算』

<更新提示>

<第一次更新>


<正文>

高精度计算

在计数类题目或者有些最优解题目中,需要输出的答案很可能会爆\(longlong\),这时候就需要用到高精度了。高精度计算较为简单,不再讲解,以下给出辅助常用的高精度计算模板:支持正整数的加,减,乘运算,读入输出,比较,以\(1e8\)压位计算,结构体封装。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int base=1e8,Maxlen=1e4;
struct bign
{
	int d[Maxlen],len;
	inline void clear(void)
	{
		len=0;
		memset(d,0,sizeof d);
	}
	inline void print(void)
	{
		printf("%d",d[len]);
		for(int i=len-1;i>=1;i--)
			printf("%08d",d[i]);
	}
	inline bign read(void)
	{
		clear();
		char s[5000];
		scanf("%s",s);
		int last=strlen(s)-1,temp;
		while(last>=7)
		{
			temp=0;
			for(int i=last-8+1;i<=last;i++)
				temp=temp*10+s[i]-'0';
			d[++len]=temp;
			last-=8;
		}
		temp=0;
		for(int i=0;i<=last;i++)
			temp=temp*10+s[i]-'0';
		d[++len]=temp;
		while(!d[len]&&len>1)len--;
		return *this;
	}
	bign operator = (int a)
	{
		clear();
		do
		{
			d[++len]=a%base;
			a/=base;
		}
		while(a);
		return *this;
	}
	bign operator * (bign a)
	{
		bign res;
		res.clear();
		long long temp;
		for(int i=1;i<=len;i++)
		{
			temp=0;
			for(int j=1;j<=a.len;j++)
			{
				temp+=1LL*d[i]*a.d[j]+res.d[i+j-1];
				res.d[i+j-1]=temp%base;
				temp/=base;
			}
			if(temp)
				res.d[i+a.len]=temp;
		}
		res.len=len+a.len;
		while(!res.d[res.len]&&res.len>1)res.len--;
		return res;
	}
	bign operator + (bign a)
	{
		for(int i=1;i<=max(a.len,len);i++)
		{
			d[i]+=a.d[i];
			d[i+1]+=d[i]/base;
			d[i]%=base;
		}
		len=max(a.len,len)+5;
		while(!d[len]&&len>1)len--;
		return *this;
	} 
	bign operator - (bign a)
	{
		for(int i=1;i<=len;i++)
		{
			d[i]-=a.d[i];
			if(d[i]<0)d[i+1]--,d[i]+=base;
		}
		while(!d[len]&&len>1)len--;
		return *this;
	} 
	bool operator < (const bign a)const
	{
		if(a.len^len)
			return len<a.len;
		for(int i=len;i>=1;i--)
			if(d[i]^a.d[i])
				return d[i]<a.d[i];
		return false;
	}
};

<后记>

posted @ 2019-03-13 21:15  Parsnip  阅读(206)  评论(0编辑  收藏  举报