C家族语言的因子

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

使用这个递归函数:

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

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

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

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

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

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

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

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

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

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

您是一名新的程序员,而您正在使用Only C ++ / C.

然后我不建议使用GMP库进行编程( 算法或编程竞赛目的 ),除非您正在为某些软件编程。

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

 // Shashank Jain #include #include #include #include #define LL long long int using namespace std; vector fact; void do_it(int num) { int temp,carry; vector:: 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: "<=0;i--) { cout< 

在Ideone上运行代码链接

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