数据类型保持一个非常大的数字说1000或更多数字? 我需要找到一个大数据的因子说100000000。 我的阶乘程序适用于较小的数字。
long factorial(int x)
{
long fact=1;
if(x<0)
{
System.out.println("Incorrect input, enter a positive number");
fact=0;
}
if(x==0)
fact=1;
if(x>0)
{
fact=x;
fact=fact*factorial(x-1);
}
return fact;
}
答案 0 :(得分:7)
您需要BigInteger
。它可以容纳任意大数。
但在你的情况下100000000!
是如此庞大的数字,没有什么可以帮助。
答案 1 :(得分:5)
你应该使用伽玛函数的日志,因为gamma(n) = (n-1)!
远比你的天真,学生的做事方式更有效率。在这种情况下,它将是双倍的,并且自然日志的增长速度将比值更慢。
递归? 请。你的问题不会是你传回的值的大小 - 在此之前你会得到太多的堆栈帧和内存不足错误。
答案 2 :(得分:1)
虽然BigInteger
理论上会处理这样的值,但实际上你无法计算它。
首先,您的算法使用递归,因此您需要100.000.000次factorial
的递归调用。在计算结果之前,您将获得堆栈溢出。您必须修改算法以避免递归(例如使用循环)。
其次,结果将是巨大。使用formulas for approximating factorials,例如
log n! ~~ n log(n/e)
我们可以得出结论,您的号码将超过750.000.000位数。虽然幸运的是你可能能够将它融入你的记忆中,但你肯定无法在任何合理的时间内计算出这个数字。试想一下 - 你必须用数亿的数字执行100.000.000次乘法。