факториальный метод не работает!
Привет этот метод факторного но он печатает 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. Некоторые требуют больше математического понимания, чем другие... Получайте удовольствие от библиотеки: -)