C家族语言中的阶乘

本文关键字:阶乘 语言 家族 | 更新日期: 2023-09-27 18:18:33

我一直在尝试在c++中创建一个阶乘函数,我刚刚发现大于10的输入不能正确计算。我尝试过c#,但我遇到了同样的问题。

使用递归函数:

   int Factorial(int Number) {
        if (Number == 0) return 1;
        return Number * Factorial(Number - 1);
    }

程序返回0的大数字,甚至小的输入,如15或16是错误的计算,我的意思是结果不同于我得到在windows计算器。

C家族语言中的阶乘

这是因为int被限制为32位,而10!的结果远远超过10会给你一个更大的结果。对于较大的值,可以使用double作为结果得到近似结果。如果需要超过16位的精度,则需要使用多精度数学库。

使用uint64_t将允许更大的数量,但仍然相当有限。

这是因为阶乘是大数字,不适合int变量。它溢出。如果您使用unsigned long long而不是int,您可以计算更大的阶乘。

如果结果不需要精确,也可以使用double。在另一种情况下,你可以在数组上实现乘法,你可以计算任意大的阶乘。

在C/c++中,我推荐GMP库

因为你问的是C家族语言:Java有一个BigInteger类型,这也很有用。

变量不能保存无限个值。在32位机器上,int可以表示的最大值是2^31-1,即2147483647。可以使用其他类型,如unsigned intlongunsigned longlong long或最大的unsigned long long。阶乘是很大的数,很容易溢出!如果你想要任意精度,你应该使用bigum库,比如GNU GMP。

原因很简单。c++中最大的是Long Long int。它的范围是~10^18。所以不能存储大于1的数。和 100 !它有158位数字所以你无法在c++/C中存储这个数字除非你可以使用vector/Array

你是一个新程序员,你只使用c++/C。

那么我将不推荐使用GMP库用于编程目的(算法或编程竞赛目的),除非你是为某些软件编程。

我认为你可以实现你自己的并使用它。我在编程比赛和算法问题中使用了这个。

// Shashank Jain
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define LL long long int
using namespace std;
vector<int> fact;
void do_it(int num)
{
    int temp,carry;
    vector<int>:: iterator it;
    carry=0;
    for(it=fact.begin();it!=fact.end();it++)
    {
        temp=(*it)*num;
        temp+=carry;
        *it=temp%10;
        carry=temp/10;
    }
    if(carry!=0)
    {
        while(carry>0) 
        {       
            temp=carry%10;
            fact.push_back(temp);
            carry/=10;
        }
    }
}
int main()
{   
    int num,i,l;
    cin>>num; // enter number for which you want to get factorial
    fact.push_back(1);
    for(i=2;i<=num;i++)
        do_it(i);
    l=fact.size();  
    cout<<"The Length of factorial is: "<<l<<endl;
    for(i=l-1;i>=0;i--)
    {
        cout<<fact[i];  
    }
    cout<<endl;
    return 0;
}

Running Code link On Ideone

这可以很容易地在不到1秒的时间内得到2000的阶乘。或者否则可以使用GMP库。但是像Google Code jam或者Facebook Hacker Cup这样的编程比赛是不允许的。或topcoder或任何其他标准编程竞赛