我一直在尝试在C ++中创建一个阶乘函数,我发现大于10的输入没有正确计算。我试过C#,但我遇到了同样的问题。
使用这个递归函数:
int Factorial(int Number) {
if (Number == 0) return 1;
return Number * Factorial(Number - 1);
}
对于大数字,程序返回0,即使是15或16这样的小输入也被错误计算,我的意思是结果与我在windows计算器中得到的结果不同。
答案 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 int
,long
,{{ 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;
}
这可以在不到1秒的时间内轻松获得2000的阶乘。或其他您可以使用GMP库。但这些不允许进行编程竞赛,如Google Code Jam或Facebook Hacker Cup。或topcoder或任何其他标准编程竞赛