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计算器。
这是因为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 int
、long
、unsigned long
、long 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或任何其他标准编程竞赛