C家族语言的因子

时间:2013-06-16 17:56:44

标签: c# c++

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

使用这个递归函数:

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

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

4 个答案:

答案 0 :(得分:3)

那是因为int限制为32位,10!超过10的结果会给你更大的结果。对于较大的值,您可以使用double作为结果获得近似结果。如果您想要超过大约16位数的精度,则需要使用multiprecision math library

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

答案 1 :(得分:1)

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

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

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

因为您要求使用C系列语言:Java具有BigInteger类型,这也很有用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你在simple中遇到问题的原因。在Long Long int中最大的C ++。它的范围是~10 ^ 18。所以你不能存储大于那个数字。并且 100!有158位数字,所以除非你可以使用vector / Array

,否则你无法在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;
}

Running Code link On Ideone

这可以在不到1秒的时间内轻松获得2000的阶乘。或其他您可以使用GMP库。但这些不允许进行编程竞赛,如Google Code Jam或Facebook Hacker Cup。或topcoder或任何其他标准编程竞赛

相关问题