Почему выходит за пределы массива

Задача: Напишите программу, которая будет рассчитывать количество конечных нулей в факториале заданного числа.

Проблема: как планирую не работает, выходит за пределы массива + не сравнивает последний символ массива 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 шт):

Автор решения: Andrew Bystrov

Во-первых, вы проверяете 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.

→ Ссылка
Автор решения: MBo

Массивы нумеруются с нуля, поэтому последний индекс будет length - 1 - вот и причина выхода за границу массива.

А вообще для решения этой задачи не нужно считать факториал. Подумайте, на каких значениях n добавляются нули в n!

→ Ссылка
Автор решения: Blacit

Демонстрация рабочего кода. Как раз то, что советовали другие.

 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;
  }
    }
→ Ссылка