факториальный метод не работает!

Привет этот метод факторного но он печатает 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 ответов


С 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;
}

нет никакого способа, вы можете разместить 500! на 32-бит int.

для вычислений, связанных с большими числами, рассмотрите возможность использования double или BigInteger в зависимости от того, хотите ли вы приблизительный или точный ответ.

(На самом деле, для 500!, даже a double было бы недостаточно:Double.MAX_VALUE это 1.7976931348623157 E+308, который" только " позволит вам подняться до 170!)


есть две вещи, которые вы должны рассмотреть, если вам нужно вычислить факториал функция:

1) Memoization. Это значительно ускорит ваши вычисления, так как факториальная функция имеет рекурсивное определение. То, что вы делаете, это кэшировать предыдущие вычисления, поэтому, когда вы просите k!, вы можете получить его в один шаг, вычисляя k*((k-1)!) если у вас (k-1)! кэшировать.

2) приближение Стирлинга. Если нужно вычислите большие факториалы, вы можете аппроксимировать их очень быстро таким образом и с гарантированными границами ошибки, поэтому вы можете сказать, будет ли аппроксимация приемлемо близка для вашего приложения.

если вы не сделаете ни того, ни другого, вы обнаружите, что есть некоторые относительно небольшие k для которого вы просто не можете вычислить k! в разумные сроки.


Grodriguez прав - это почти наверняка вызвано переполнением целочисленного значения.

Если вы тестируете свой метод с более скромными входами, он возвращает правильный выход:

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! is огромные; при тестировании вашей функции, начиная с меньших входов, было бы разумно.


500! is путь слишком большой, чтобы поместиться длинный или двойной.
Для этого вам придется использовать другие методы.

но сначала, какая программа нужна 500!?


есть очень хорошая оптимизация для реализации факторизации: см., например,luschny.de для хорошей реализации их в Java. Некоторые требуют больше математического понимания, чем другие... Получайте удовольствие от библиотеки: -)