Почему выходит за пределы массива
Задача: Напишите программу, которая будет рассчитывать количество конечных нулей в факториале заданного числа.
Проблема: как планирую не работает, выходит за пределы массива + не сравнивает последний символ массива char с '0', чтобы прошло по условию.
int result = 1;
int count = 0;
// Считаем факториал
for (int i = 1; i <= n; i++) {
result = result * i;
}
char[] factorial = Integer.toString(result).toCharArray();
int length = factorial.length;
int i = 0;
// Здесь делаем поиск нулей. Сравниваем последний эл-нт массива.
while (i <= length) {
if (factorial[length] == '0' && n > 1) {
count++;
length--;
} else
break;
}
return result;
Ответы (3 шт):
Во-первых, вы проверяете factorial[length], где length = factorial.length. Опишу проблему на примере.
У вас факторил числа 10! = 3628800. Соответственно, length в данном случае будет равно 7. И вы забираете сразу значение factorial[7] - такого элемента нет, т.к. отсчет в массиве начинается с 0 => чтобы проверить последнюю цифру, надо проверять factorial[6], т.е. начальное условие будет factorial[length - 1].
Во-вторых, если вы на вход подадите число, скажем 100, то у вас ничего не получится - проблема будет в том, что 100! > Integer.MAX_VALUE - у вас будет переполнение и факториал правильно не посчитается.
Чтобы этого избежать - не надо вычислять сам факториал, нужно вычислять кол-во нулей в конце. Ноль на конце дает перемножение числа 5 на 2, либо же число кратное 10.
Массивы нумеруются с нуля, поэтому последний индекс будет length - 1 - вот и причина выхода за границу массива.
А вообще для решения этой задачи не нужно считать факториал. Подумайте, на каких значениях n добавляются нули в n!
Демонстрация рабочего кода. Как раз то, что советовали другие.
public class Solution {
public static int zeros(int n) {
int res = 0;
for (int i = 5; i <= n; i *= 5) {
res += n / i;
}
return res;
}
}