nyoj-28 大数阶乘(模板题)

大数阶乘

题目描述:
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入描述:
输入一个整数m(0<m<=5000)
输出描述:
输出m的阶乘,并在输出结束之后输入一个换行符

样例输入:
50

样例输出:
30414093201713378043612608166064768844377641568960512000000000000

就是一道求大数阶乘的模板题,存一波模板

AC代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 50010
string bigFactorial(int n)
{
    int a[maxn],k=1;
    a[0]=1;
    for(int i=2; i<=n; i++)
    {
        int num=0;
        for(int j=0; j<k; j++)
        {
            int temp=a[j]*i+num;
            a[j]=temp%10;
            num=temp/10;
        }
        while(num!=0)
        {
            a[k]=num%10;
            num/=10;
            k++;
        }
    }
    string s="";
    for(int i=k-1; i >= 0; i--)
        s+=a[i]+'0';
    return s;
}
int main()
{
    int n;
    scanf("%d",&n);
    cout<<bigFactorial(n)<<endl;
    cout<<endl;
    return 0;
}


关于大数的其他模板也收集一下

大数加法

string sum(string s1,string s2) //大数加法
{
	if(s1.length()<s2.length())
	{
		string temp=s1;
		s1=s2;
		s2=temp;
	}
	int i,j;
	for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
	{
		s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); 
		if(s1[i]-'0'>=10)
		{
			s1[i]=char((s1[i]-'0')%10+'0');
			if(i) s1[i-1]++;
			else s1='1'+s1;
		}
	}
	return s1;
}

大数减法

string bigIntegerSub(char *s1,char *s2) //大数减法
{
    if(s1==s2)
        return "0"; //相等
    int len1=strlen(s1),len2=strlen(s2);
    if(len1>len2)
        return subInfo(s1,s2);
    else if(len1<len2)
        return "-"+subInfo(s2,s1); //负数
    else                          //长度相等时判断大小
    {
        for(int i=0; i<len1; i++)
        {
            if(s1[i]-'0'>s2[i]-'0')
                return subInfo(s1,s2);
            else if(s1[i]-'0'< s2[i]-'0')
                return "-" +subInfo(s2,s1);
        }
    }
}

大数乘以整型数

string Multiply(string s,int x)  //大数乘以整型数
{
    reverse(s.begin(),s.end());
    int cmp=0;
    for(int i=0;i<s.size();i++)
    {
        cmp=(s[i]-'0')*x+cmp;
        s[i]=(cmp%10+'0');
        cmp/=10;
    }
    while(cmp)
    {
        s+=(cmp%10+'0');
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}

大数除以整型数

string Except(string s,int x)  //大数除以整形数
{
    int cmp=0,ok=0;
    string ans="";
    for(int i=0;i<s.size();i++)
    {
        cmp=(cmp*10+s[i]-'0');
        if(cmp>=x)
        {
            ok=1;
            ans+=(cmp/x+'0');
            cmp%=x;
        }
        else{
            if(ok==1) ans+='0';
        }
    }
    return ans;
}

大数乘法

string sum(string s1,string s2)  //大数加法
{
	if(s1.length()<s2.length())
	{
		string temp=s1;
		s1=s2;
		s2=temp;
	}
	int i,j;
	for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
	{
		s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
		if(s1[i]-'0'>=10)
		{
			s1[i]=char((s1[i]-'0')%10+'0');
			if(i) s1[i-1]++;
			else s1='1'+s1;
		}
	}
	return s1;
}
 
string Mult(string s,int x)  //大数乘以整形数
{
    reverse(s.begin(),s.end());
    int cmp=0;
    for(int i=0;i<s.size();i++)
    {
        cmp=(s[i]-'0')*x+cmp;
        s[i]=(cmp%10+'0');
        cmp/=10;
    }
    while(cmp)
    {
        s+=(cmp%10+'0');
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}
string Multfa(string x,string y)  //大数乘法
{
    string ans;
    for(int i=y.size()-1,j=0;i>=0;i--,j++)
    {
        string tmp=Mult(x,y[i]-'0');
        for(int k=0;k<j;k++)
            tmp+='0';
        ans=sum(ans,tmp);
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/weixin_44137005/article/details/88972957