阶乘法效果不好!
你好 这是一个阶乘方法,但它在控制台中打印 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;
}
}
Hi
this is a factorial method but it prints 0 in the console please help me thanks
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;
}
EDITED:will return Infinity!
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
由于
500!
等于,因此您无法将其放入
int
(范围最大为2147483647
)中。int
最多只能存储12!
。long
,您将获得20!
double
,您将获得170!
。这是使用 BigInteger 的解决方案:
Since
500!
equals1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
you can't fit it into anint
(which ranges up to2147483647
).int
you can only store up to12!
.long
you'll get up to20!
double
you'll get up to170!
.Here is a solution using
BigInteger
:您无法将
500!
放入 32 位int
中。对于涉及大数的计算,请考虑使用
double
或BigInteger
,具体取决于您想要近似答案还是精确答案。(实际上,对于
500!
,即使是double
也不够:Double.MAX_VALUE
是 1.7976931348623157E+308,这将“仅”让您达到170!
)There's no way you can fit
500!
on a 32-bitint
.For calculations involving large numbers, consider using a
double
or aBigInteger
, depending on whether you want an approximate or an exact answer.(Actually, for
500!
, even adouble
would not be enough:Double.MAX_VALUE
is 1.7976931348623157E+308, which will "only" let you go up to170!
)如果您需要计算阶乘函数,您应该考虑两件事:
1)记忆化 。这将极大地加快计算速度,因为阶乘函数具有递归定义。你所做的就是缓存之前的计算,所以当你请求
k!
时,你可以通过计算k*((k-1)!)
if您已缓存(k-1)!
。2) 斯特林近似。如果您需要计算大阶乘,您可以通过这种方式非常快速地近似它们,并保证误差范围,这样您就可以判断近似值对于您的应用程序是否可以接受。
如果您不执行这些操作,您会发现存在一些相对较小的
k
,您根本无法在合理的时间内计算出k!
。There are two things you should be looking into if you need to calculate the factorial function:
1) Memoization. This will dramatically speed up your calculations, since the factorial function has a recursive definition. What you do is cache previous calculations, so when you ask for
k!
, you can get it in one step by calculatingk*((k-1)!)
if you have(k-1)!
cached.2) Stirling's approximation. If you need to calculate large factorials, you can approximate them very rapidly this way, and with guaranteed bounds on the error, so you can tell whether the approximation will be acceptably close for your application.
If you do neither of these, you will find that there is some relatively small
k
for which you simply can't calculatek!
in a reasonable amount of time.Grodriguez 是对的 - 这几乎肯定是由整数溢出引起的。
如果您使用更适度的输入测试您的方法,它似乎会返回正确的输出:
500!
is massive;当测试你的函数时,从较小的输入开始是谨慎的。Grodriguez is right - this is almost certainly caused by integer overflow.
If you test your method with more modest inputs it appears to return the right output:
500!
is massive; when testing your function, starting with smaller inputs would be prudent.500!
远远太大,不适合长款或双款。您必须使用其他技术才能获得此结果。
但首先,什么样的程序需要
500!
?500!
is way too big to fit a long, or double.You would have to use other techniques to get this.
But first, what kind of program needs
500!
?对于分解的实现有一些非常好的优化:例如参见 luschny.de 在 Java 中很好地实现了它们。有些需要比其他更多的数学洞察力......享受图书馆的乐趣:-)
There are some very nice optimization for the implementation of factorizations: see for instance luschny.de for a nice implementation of them in Java. Some require more mathematical insight then others... Have fun with the library :-)