计算阶乘10 .. 100而不重复任何代码?

时间:2013-12-25 13:12:19

标签: java

我可以通过使用for循环来实现它,但它太长了。我必须做大约10个for循环。

 System.out.println("factorial of 10");
 int fact = 1;
 for (int x=1;x<=10;x++) {
     fact=fact*x;
     System.out.println(fact);
 }

 System.out.println(" factorial of 20 ");
 double fact1 = 1;
 for (double y=1;y<=20;y++){
     fact1=fact1*y;
     System.out.println(fact1);
 }

3 个答案:

答案 0 :(得分:2)

您可以使用递归方法计算factorials.Also在解决方案中根据您调整类型。像BigIntegerLong

public class Factorial {
    public static void main (String[] args) {
        int theNum, theFact;
        System.out.println("This program computes the factorial " +
                "of a number.");
        System.out.print("Enter a number: ");
        theNum=Console.in.readInt();
        theFact = fact(theNum);
        System.out.println(theNum + "! = " + theFact + ".");
    }

    static int fact(int n) {
        if (n <= 1) {
            return 1;
        }
        else {
            return n * fact(n-1);
        }
    }
}

答案 1 :(得分:1)

您可以将每个计算的阶乘数放入数组,并通过检索数组的最后一个元素来计算新的阶乘值。但是,你知道,你可以计算多达12个!使用int类型因为13!,数字变得大于int的MAX_VALUE(2 ^ 31-1)。您可以使用BigInteger对象作为解决方案。

或者,如果您只需要计算这些特定数字的因子值,您可以调用递归函数,该函数就像上面的解决方案一样。

答案 2 :(得分:1)

使用Stirling approximation进行Gamma功能

enter image description here

您可以使用此等式来完成这项工作。如果它没有循环,它就不是一种计算机语言。


编辑:或者您可以使用以下代码,无需任何显式循环(借用here)。

import javax.swing.Timer;
import java.awt.event.*;
import java.util.concurrent.ArrayBlockingQueue;

public class Fac {
    public static int fac(final int _n) {
        final ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1);
        final Timer timer = new Timer(0, null);
        timer.addActionListener(new ActionListener() {
            int result = 1;
            int n = _n;
            public void actionPerformed(ActionEvent e) {
                result *= n;
                n--;
                if(n == 0) {
                    try {
                        queue.put(result);
                    } catch(Exception ex) {
                    }
                    timer.stop();
                }
            }
        });
        timer.start();
        int result = 0;
        try {
            result = queue.take();
        } catch(Exception ex) {
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(fac(10));
    }
}