zoukankan      html  css  js  c++  java
  • 高精度封装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);
    }
    
    
  • 相关阅读:
    C# 不用添加WebService引用,调用WebService方法
    贪心 & 动态规划
    trie树 讲解 (转载)
    poj 2151 Check the difficulty of problems (检查问题的难度)
    poj 2513 Colored Sticks 彩色棒
    poj1442 Black Box 栈和优先队列
    啦啦啦
    poj 1265 Area(pick定理)
    poj 2418 Hardwood Species (trie树)
    poj 1836 Alignment 排队
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12649689.html
Copyright © 2011-2022 走看看