Java 析因法不';工作不好!
嗨 这是一个阶乘方法,但它在控制台中打印0。请帮助我,谢谢Java 析因法不';工作不好!,java,math,factorial,Java,Math,Factorial,嗨 这是一个阶乘方法,但它在控制台中打印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
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;
}
公共类演示{
公共静态void main(字符串[]args){
Demo obj=新的Demo();
系统输出println(对象阶乘(500));
}
公共整数阶乘(整数n){
int-fact=1;
对于(int i=2;i您无法在32位int
上安装500!
关于大数的计算,考虑使用<代码>双< /代码>或A,这取决于你是否想要一个近似的或确切的答案。
(实际上,对于
500!
,即使是double
也不够:double.MAX_值
是1.7976931348623157E+308,这将“仅”让您上升到170!
)-这几乎肯定是由整数溢出引起的
如果您使用更适度的输入测试方法,它似乎会返回正确的输出:
public static void main(String[] args) {
Demo obj = new Demo();
for (int i = 0; i < 10; i++)
System.out.println(i + "! = " + obj.factorial(i));
}
publicstaticvoidmain(字符串[]args){
Demo obj=新的Demo();
对于(int i=0;i<10;i++)
系统输出println(i+“!=”+obj.factorial(i));
}
500!
是大规模的;在测试功能时,从较小的输入开始是谨慎的。因为500!
等于12201368259991110068701238785423046926255742803192219241358838584537315388199760549644750328186301367714820341633787220781772004807520932825847790757193037760859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158732768888680120399882384702151467605445407663535984174430480128931389681639474696588175045069263338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- 使用
int
最多只能存储12!
- 使用
long
你最多可以得到20!
- 使用
double
您将得到170!
下面是一个使用biginger
的解决方案:
public static BigInteger factorial(int i) {
BigInteger n = BigInteger.valueOf(i);
while (--i > 0)
n = n.multiply(BigInteger.valueOf(i));
return n;
}
500!
太大了,装不下长的或双人的。
您必须使用其他技术来实现此目的
但是首先,什么样的程序需要500!
?如果需要计算阶乘函数,有两件事需要考虑:
1) 。这将大大加快您的计算速度,因为阶乘函数具有递归定义。您要做的是缓存以前的计算,因此当您请求k!
时,您可以通过计算k*((k-1)!)
一步获得它,如果您已缓存(k-1)!
2) 。如果您需要计算大阶乘,您可以通过这种方式非常快速地对其进行近似,并保证误差范围,这样您就可以判断近似值是否适合您的应用程序
如果你不做这两项,你会发现有一些相对较小的k
,你根本无法在合理的时间内计算k!
。对于分解的实现有一些非常好的优化:例如,请参阅Java中的一个很好的实现。有些需要更多的优化hematical insight然后其他人…从库中获得乐趣:-)使用BigInteger man!首先了解您的语言。\m/非常感谢您的回答!:)为了提高性能,您还可以先检查i,如果需要,切换到BigInteger^!这将是一个小的改进,因为它只针对非常小的输入值优化方法。什么类型的程序需要500!?组合数学问题通常都有非常大的数字。@Tony,我的意图是告诉OP,他的500!案例可能与他的案例无关。也许措辞拙劣。
public static BigInteger factorial(int i) {
BigInteger n = BigInteger.valueOf(i);
while (--i > 0)
n = n.multiply(BigInteger.valueOf(i));
return n;
}