高精度

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N=10050;
const int base=1e9;
char s[N]="";

struct Bint
{
	ll num[N]; int len;
	Bint(){memset(num,0,sizeof num); len=0;}
};

Bint operator +( const Bint &a, const Bint &b)
{
	Bint ans;
	int len=max(a.len,b.len);
	for(int i=1;i<=len;i++)
	{
		ans.num[i]+=a.num[i]+b.num[i];//此处用+=因为要进位 
		ans.num[i+1]+=ans.num[i]/base;  ans.num[i]=ans.num[i]%base;
	}
	ans.len=max(a.len,b.len);
	if(ans.num[ans.len+1]) ans.len++;
	return ans;
}

bool operator <(const Bint &a,const Bint &b)
{
	if(a.len<b.len) return true;
	if(a.len>b.len) return false;
	for(int i=a.len;i>=1;i--)
	{
		if(a.num[i]>b.num[i]) return false;
		if(a.num[i]<b.num[i]) return true;//比较大小 
	}
	return false;
}


bool operator ==(const Bint &a,const Bint &b)
{
	if(a.len!=b.len) return false;
	for(int i=1;i<=a.len;i++)
		if(a.num[i]!=b.num[i]) return false;
	return true;
}

bool operator <=(const Bint &a,const Bint &b)
{
	return a<b||a==b;
}


//a>b
Bint operator -(const Bint &a,const Bint &b)
{
	Bint ans;
	int len=max(a.len,b.len);
	for(int i=len;i>=1;i--)
	{
		if(a.num[i]>=b.num[i]) ans.num[i]=a.num[i]-b.num[i];
		else ans.num[i+1]--,ans.num[i]=a.num[i]+base-b.num[i];
	}
	while(!ans.num[len]) len--;
	ans.len=len;
	return ans; 
}


Bint operator *(const Bint &a,const Bint &b)
{
	Bint ans;
	for(int i=1;i<=b.len;i++)//长度小 
		for(int j=1;j<=a.len;j++)//长度大 
		{
			ans.num[i+j-1]+=b.num[i]*a.num[j];
			ans.num[i+j]+=ans.num[i+j-1]/base;
			ans.num[i+j-1]%=base;
		}
	ans.len=a.len+b.len+1;//乘法后的位数问题 
	while(!ans.num[ans.len]) ans.len--;
	return ans;
}

Bint T(int x)
{
	Bint ans;
	ans.len=1; ans.num[1]=x;
	return ans;
}


int find(Bint a,Bint b)
{
	int l=0,r=base;
	while(l+1<r)
	{
		int mid=(l+r)>>1;
		if( b*T(mid)<=a ) l=mid;
		else r=mid;
	}
	return l;
}

//a>b a/b
Bint operator /(const Bint &a,const Bint &b)
{
	Bint ans,tmp; 
	for(int i=a.len;i>=1;i--)
	{
		tmp=tmp*T(base); tmp=tmp+T(a.num[i]);
		if(tmp.len>=b.len) ans.num[i]=find(tmp,b);
		tmp=tmp-( b*T(ans.num[i]));
	}
	ans.len=a.len-b.len+1;
	while(!ans.num[ans.len]) ans.len--;
	return ans;
}

//注意: 前导0 
void print(Bint a)
{
	printf("%lld",a.num[a.len]);
	for(int i=a.len-1;i>=1;i--)
		printf("%.9lld",a.num[i]);
}
//技巧: 从0开始就可以避免位移判断 

Bint read()
{
	Bint ans;	
	scanf("%s",s); int len=strlen(s); 
	for(int i=0;i<len;i++)
	{
		char c=s[i];
		if(c>='0'&&c<='9')
		{
			int t=len-1-i;
			ans.num[t/9+1]=ans.num[t/9+1]*10+c-'0'; 
		}
	}
	ans.len=(len-1)/9+1;
	return ans;
}
posted @ 2022-03-10 19:11  __iostream  阅读(33)  评论(0)    收藏  举报