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);
    }
    
    
  • 相关阅读:
    CAsyncSocket网络编程(MFC)
    CSDN回帖得分大全(近两年)
    VC:使用Windows Socket开发应用程序
    MFC对Socket编程的支持
    计算机操作系统
    计算机基础
    计算机发展历史
    iOS开发之国际化
    iOS开发之iOS程序偏好设置(Settings Bundle)的使用
    iOS中使用RegexKitLite来试用正则表达式 使用ARC 20个错误解决办法
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12649689.html
Copyright © 2011-2022 走看看