高精度封装Bignum

还没有写完,目前只实现了加,乘,且不能作用于负数

\(update\ in 20.4.8 添加了高精除低精ddiv函数,比较大小comp函数\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=5009;
struct bignum{
	int num[maxn],len;
	bignum(){memset(num,0,sizeof(num));}
};
bool comp(bignum a,bignum b)//比较函数
{
	if(a.len!=b.len)	return (a.len>b.len)?1:0;
	for(int i=a.len-1;i>=0;i--)
	if(a.num[i]!=b.num[i])	return (a.num[i]>b.num[i])?1:0;
	return -1;//相等	
} 
bignum operator / (bignum a,int b)//高精除以低精度
{
	bignum c=a;
	int tw=0,len=a.len;
	for(int i=len-1;i>=0;i--)
	{
		int k=(tw*10+c.num[i])/b;
		tw=(tw*10+c.num[i])%b;
		c.num[i]=k;
	}
	while(c.num[len-1]==0)	len--;
	c.len=len;
	return c;
}
bignum init(bignum &a,string s)
{
	int len=s.length();
	if(s[0]=='-')//处理负数
		len--,a.num[maxn-1]=-1;//这样len-i-1就不会到0去,且留下是负数的标记 
	for(int i=0;i<len;i++)
		a.num[i]=s[len-i-1]-'0';
	a.len=len;
	return a; 
}
bignum Add(bignum &a,bignum &b)
{
	bignum c;
	int len=max(a.len,b.len);
	for(int i=0;i<len;i++)
	{
		c.num[i]+=(a.num[i]+b.num[i]);
		c.num[i+1]+=c.num[i]/10;
		c.num[i]%=10;
	}
	if(c.num[len])	len++;//加法最多进1位 
	c.len=len;
	return c;
}
bignum dmull(bignum &a,int s)//高精乘低精 
{
	for(int i=0;i<a.len;i++)	a.num[i]*=s;
	for(int i=0;i<a.len;i++)
	{
		if(a.num[i]>=10)
		{
			if(i==a.len-1)	a.len++;
			a.num[i+1]+=a.num[i]/10;
			a.num[i]%=10;
		}
	}
	return a; 
}
bignum Hmull(bignum &a,bignum &b)//高精乘高精 
{
	bignum c;
	for(int i=0;i<a.len;i++)
	for(int j=0;j<b.len;j++)
	{
		c.num[i+j]+=(a.num[i]*b.num[j]);
		c.num[i+j+1]+=c.num[i+j]/10;
		c.num[i+j]%=10;
	}
	int len=a.len+b.len;
	while(c.num[len-1]==0&&len>1)	len--;
	c.len=len;
	return c;
}
bignum ddiv(bignum a,bignum b,bignum &c,int &f)//低精度除法 
{
	//c是除的结果,f是余数 
	for(int i-a.len-1;i>=0;i--)
	{
		f=f*10+a.num[i];//慢慢做求余 
		c.num[i]=f/b;
		f%=b;
	}
	while(len>1&&c.num[len-1]==0)	len--;
	c.len=len; 
}
void print(bignum &a)
{
	for(int i=a.len-1;i>=0;i--)	cout<<a.num[i];
}
int main()
{
	int n;
	cin>>n;
	bignum temp,ans;
	//下面是求解S=1!+2!+3!....+n! 
	init(ans,"1");init(temp,"1");
	for(int i=2;i<=n;i++)
	{
		temp=dmull(temp,i);
		ans=Add(ans,temp);
	}
	print(ans);
}

posted @ 2020-04-06 21:22  倾叶子佮  阅读(234)  评论(0编辑  收藏  举报