你好,这是一个阶乘方法,但它在控制台中打印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;
}
}
发布于 2010-10-11 19:20:09
因为500!
等于1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
,所以不能将它放入int
(最大范围为2147483647
)。
12!
.
int
你最多只能存储一个long
你会得到一个double
你会得到一个你会得到一个int
这是一个使用BigInteger
的解决方案
public static BigInteger factorial(int i) {
BigInteger n = BigInteger.valueOf(i);
while (--i > 0)
n = n.multiply(BigInteger.valueOf(i));
return n;
}
发布于 2010-10-11 19:15:18
你不可能在32位int
上安装500!
。
对于涉及大数的计算,请考虑使用double
或BigInteger
,具体取决于您需要的是近似答案还是确切答案。
(实际上,对于500!
,即使是一个double
也是不够的:Double.MAX_VALUE
是1.7976931348623157E+308,它将“只”让您使用170!
)
发布于 2010-10-11 21:06:16
如果您需要计算阶乘函数,您应该考虑两件事:
1) Memoization。这将极大地加快计算速度,因为阶乘函数具有递归定义。您所做的是缓存以前的计算,因此当您请求k!
时,如果您缓存了(k-1)!
,则可以通过计算k*((k-1)!)
一步获得它。
2) Stirling's approximation。如果你需要计算大的阶乘,你可以用这种方法非常快速地近似它们,并保证误差的范围,这样你就可以判断对于你的应用来说,近似是否可以接受。
如果您不这样做,您会发现有一些相对较小的k
无法在合理的时间内计算出k!
。
https://stackoverflow.com/questions/3905658
复制相似问题