-1

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

使用这个递归函数:

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

程序为大数返回 0,即使是 15 或 16 这样的小输入也会被错误计算,我的意思是结果与我在 windows 计算器中得到的不同。

4

4 回答 4

3

那是因为int限制为 32 位,10!超过 10 位的结果会给您带来更大的结果。double对于较大的值,您可以使用as 结果获得近似结果。如果您想要超过 16 位的精度,则需要使用多精度数学库

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

于 2013-06-16T18:00:56.710 回答
1

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

如果结果不需要精确,也可以使用 double。在另一种情况下,您可以在数组上实现乘法,并且可以根据需要计算尽可能大的阶乘。

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

并且因为您要求使用 C 系列语言:Java 有一种BigInteger也很有用的类型。

于 2013-06-16T17:59:35.520 回答
0

变量不能包含无限数量的值。在 32 位机器上,an 可以表示的最大值int为 2^31-1,即 2147483647。您可以使用其他类型,例如unsigned int, long, unsigned long,long long或最大的类型 , unsigned long long。阶乘是很大的数字,很容易溢出!如果您想要任意精度,您应该使用 bignum 库,例如 GNU GMP。

于 2013-06-16T18:02:04.027 回答
0

简单问题的原因。在 Long Long int 中最大的 C++ 中。它的范围为~10 ^ 18。所以你不能存储大于那个的数字。和100!其中有 158 位数字,因此除非您可以使用向量/数组,否则您无法将该数字存储在 C++/C 中

您是一名新程序员,并且您正在使用 Only 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;
}

在 Ideone 上运行代码链接

这可以在不到 1 秒的时间内轻松获得 2000 的阶乘。否则您可以使用 GMP 库。但是这些是不允许参加像 Google Code jam 或 Facebook Hacker Cup 这样的编程竞赛的。或 topcoder 或任何其他标准编程竞赛

于 2013-06-17T08:22:19.210 回答