阶乘法不能很好地运作!

时间:2010-10-11 11:12:48

标签: 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 (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;
    }
}

6 个答案:

答案 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上。

对于涉及大数字的计算,请考虑使用doubleBigInteger,具体取决于您是否需要近似或准确答案。

(实际上,对于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中很好地实现它们。有些人需要比其他人更多的数学见解......与图书馆一起玩:-)