您好 这是一个因子方法,但它在控制台中打印0请帮助我谢谢
public class Demo {
public static void main(String[] args) {
Demo obj = new Demo();
System.out.println(obj.factorial(500));
}
public int factorial(int n) {
int fact = 1;
for (int i = 2; i <= n; i++) {
fact= fact*i;
}
return fact;
}
编辑:将返回无限!
public class Demo {
public static void main(String[] args) {
Demo obj = new Demo();
System.out.println(obj.factorial(500));
}
public double factorial(long n) {
double fact = 1;
for (int i = 2; i <= n; i++) {
fact= fact*i;
}
return fact;
}
}
答案 0 :(得分:18)
由于500!
等于1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
,您无法将其放入int
(范围最高为2147483647
)。
int
,您最多只能存储12!
。long
,您将获得20!
double
,您最多可以使用170!
。以下是使用BigInteger
的解决方案:
public static BigInteger factorial(int i) {
BigInteger n = BigInteger.valueOf(i);
while (--i > 0)
n = n.multiply(BigInteger.valueOf(i));
return n;
}
答案 1 :(得分:4)
您无法将500!
放在32位int
上。
对于涉及大数字的计算,请考虑使用double
或BigInteger
,具体取决于您是否需要近似或准确答案。
(实际上,对于500!
,即使double
也是不够的:Double.MAX_VALUE
是1.7976931348623157E + 308,这将“仅”让您上升到{{1} })
答案 2 :(得分:2)
如果你需要计算阶乘函数,你应该考虑两件事:
1)Memoization。这将大大加快您的计算速度,因为阶乘函数具有递归定义。您所做的是缓存以前的计算,因此当您要求k!
时,如果您k*((k-1)!)
已缓存,则可以通过计算(k-1)!
来一步完成。
2)Stirling's approximation。如果你需要计算大的阶乘,你可以用这种方式非常快速地逼近它们,并且在误差上有保证的界限,所以你可以判断近似值对于你的应用是否可接受。
如果您同时执行这两项操作,您会发现有一些相对较小的k
,您无法在合理的时间内计算k!
。
答案 3 :(得分:0)
Grodriguez is right - 这几乎肯定是由整数溢出引起的。
如果您使用更适度的输入测试您的方法,它似乎返回正确的输出:
public static void main(String[] args) {
Demo obj = new Demo();
for (int i = 0; i < 10; i++)
System.out.println(i + "! = " + obj.factorial(i));
}
500!
大量;在测试你的功能时,从较小的输入开始是谨慎的。
答案 4 :(得分:0)
500!
方式 太大,不适合长或双。
你必须使用其他技术才能得到这个。
但首先,什么样的程序需要500!
?
答案 5 :(得分:0)
对于因子分解的实现有一些非常好的优化:例如,参见luschny.de,以便在Java中很好地实现它们。有些人需要比其他人更多的数学见解......与图书馆一起玩:-)