Как найти количество нулей в факториале

Подсчет конечных нулей факториала числа в любой системе счисления

Время на прочтение
2 мин

Количество просмотров 19K

Как я могу посчитать количество конечных нулей факториала числа в определенной системе счисления?

Давайте рассмотрим случай, когда мы находимся в 10-й системе счисления, а затем посмотрим, как мы можем обобщить это в универсальное решение. Нам дано число N и для его факториала нужно найти количество конечных нулей. Решение будет довольно простым — сумма:

Math.floor(N/5) + Math.floor(N/25) + Math.floor(N/125) + Math.floor(N/625) + ...

Её мы можем обобщить в такую формулу:

$sumlimits_{i=1}^infty {N over 5^i}.$

Почему 5? Это просто. Конечный ноль получается только тогда, когда в составе факториала число имеет 10. Таким образом, посчитав количество десяток в факториале, мы узнаем количество конечных нулей.

Почему в примере выше мы делим на 5? Потому что 10 может быть получено умножением 5 на 2. Поэтому полное решение будет иметь две формулы:

$sumlimits_{i=1}^infty {N over 5^i}$

и

$sumlimits_{i=1}^infty {N over 2^i}.$

Но, рассуждая логически, мы знаем, что первая сумма будет меньше, поэтому нам нужно посчитать только её (подробнее можно почитать тут).

Решение нашей проблемы

Для подсчёта конечных нулей факториала числа в определенной системе счисления я составил алгоритм, приведенный ниже:

  1. Разложить число B системы счисления на простые множители.
  2. Разделить число N на каждый уникальной простой множитель K, домножая K сам на себя до тех пор, пока $N over K$ будет больше единицы, при этом округляя каждый результат до меньшего целого.
  3. Если при разложении числа системы счисления мы получили несколько одинаковых простых множителей K, то результат выше мы должны разделить на количество одинаковых K.
  4. Из всех делений N на каждый уникальный множитель K выбрать наименьшее частное, которое и будет нашим ответом.

Я покажу это на примере.
Пусть число N = 5, система счисления B = 12. Факториал 5! = 120, а 120 в 12-ой системе — A0. Мы видим, что в конечной системе счисления факториал исходного числа имеет один ноль. При разложении 12 на простые множители получим 2, 2, 3. У нас есть два уникальных числа: 2 и 3. Следуя нашему алгоритму выполним пункт 2 с числом 2.

${5 over 2 } + {5 over 4 } + {5 over 8 } + ... = 2+1+0+... =3.$

Но двойка встречалась дважды при разложении 12-и, поэтому конечный результат мы делим на 2 и округляем до меньшего целого. В результате получаем 1.

Проделываем тоже самое с 3:

${5 over 3 } + {5 over 9 } + ... = 1+0+... =1.$

Таким образом, мы получили два частных от делений числа N на простые множители числа системы счисления. Они оба равны 1, поэтому меньшее нам выбирать не приходится и мы просто даем ответ — 1.

Рассмотрим еще один пример.

Пусть число N = 16, система счисления B = 16. Факториал 16! = 20922789888000, а 20922789888000 в 16-ой системе — 130777758000. Мы видим, что в конечной системе счисления факториал исходного числа имеет три ноля. При разложении 16 на простые множители, получим 2, 2, 2, 2. Здесь у нас только одно уникальное число, поэтому пункт 2 выполняется только один раз:

${16 over 2 } + {16 over 4 } + {16 over 8 } + {16 over 16 } + {16 over 32 } + ... = 8+4+2+1+0+... =15.$

При разложении у нас было четыре двойки, поэтому сумму делений делим на 4 с округлением до меньшего целого:

$ {15over 4} = 3.$

P.S. Большую часть материала для поста перевел отсюда. Автор — Aditya Ramesh.

Given an integer n, write a function that returns count of trailing zeroes in n!. 
Examples : 

Input: n = 5
Output: 1 
Factorial of 5 is 120 which has one trailing 0.

Input: n = 20
Output: 4
Factorial of 20 is 2432902008176640000 which has
4 trailing zeroes.

Input: n = 100
Output: 24

We strongly recommend that you click here and practice it, before moving on to the solution.

  1. Approach:
    A simple method is to first calculate factorial of n, then count trailing 0s in the result (We can count trailing 0s by repeatedly dividing the factorial by 10 till the remainder is not 0).
     
  2. The above method can cause overflow for slightly bigger numbers as the factorial of a number is a big number (See factorial of 20 given in above examples). The idea is to consider prime factors of a factorial n. A trailing zero is always produced by prime factors 2 and 5. If we can count the number of 5s and 2s, our task is done. Consider the following examples.
    n = 5: There is one 5 and 3 2s in prime factors of 5! (2 * 2 * 2 * 3 * 5). So a count of trailing 0s is 1.
    n = 11: There are two 5s and eight 2s in prime factors of 11! (2 8 * 34 * 52 * 7). So the count of trailing 0s is 2.
     
  3. We can easily observe that the number of 2s in prime factors is always more than or equal to the number of 5s. So if we count 5s in prime factors, we are done. How to count the total number of 5s in prime factors of n!? A simple way is to calculate floor(n/5). For example, 7! has one 5, 10! has two 5s. It is not done yet, there is one more thing to consider. Numbers like 25, 125, etc have more than one 5. For example, if we consider 28! we get one extra 5 and the number of 0s becomes 6. Handling this is simple, first, divide n by 5 and remove all single 5s, then divide by 25 to remove extra 5s, and so on. Following is the summarized formula for counting trailing 0s.
Trailing 0s in n! = Count of 5s in prime factors of n!
                  = floor(n/5) + floor(n/25) + floor(n/125) + ....

Following is a program based on the above formula: 

C++

#include <iostream>

using namespace std;

int findTrailingZeros(int n)

{

    if (n < 0)

        return -1;

    int count = 0;

    for (int i = 5; n / i >= 1; i *= 5)

        count += n / i;

    return count;

}

int main()

{

    int n = 100;

    cout << "Count of trailing 0s in " << 100 << "! is "

         << findTrailingZeros(n);

    return 0;

}

Java

import java.io.*;

class GFG {

    static int findTrailingZeros(int n)

    {

        if (n < 0)

            return -1;

        int count = 0;

        for (int i = 5; n / i >= 1; i *= 5)

            count += n / i;

        return count;

    }

    public static void main(String[] args)

    {

        int n = 100;

        System.out.println("Count of trailing 0s in " + n

                           + "! is "

                           + findTrailingZeros(n));

    }

}

Python3

def findTrailingZeros(n):

    if(n < 0):

        return -1

    count = 0

    while(n >= 5):

        n //= 5

        count += n

    return count

n = 100

print("Count of trailing 0s " +

      "in 100! is", findTrailingZeros(n))

C#

using System;

class GFG

{

    static int findTrailingZeros(int n)

    {

          if(n < 0)

              return -1;       

        int count = 0;

        for (int i = 5; n / i >= 1; i *= 5)

            count += n / i;

        return count;

    }

    public static void Main ()

    {

        int n = 100;

        Console.WriteLine("Count of trailing 0s in " +

                                           n +"! is "+

                                findTrailingZeros(n));

    }

}

PHP

<?php

function findTrailingZeros( $n)

{

      if($n < 0)

      return -1;   

    $count = 0;

    for ($i = 5; $n / $i >= 1; $i *= 5)

        $count += $n / $i;

    return $count;

}

$n = 100;

echo "Count of trailing 0s in " , 100,

     "! is " , findTrailingZeros($n);

?>

Javascript

<script>

function findTrailingZeros(n)

{

    if(n < 0)

      return -1;

    let count = 0;

    for (let i = 5; Math.floor(n / i) >= 1; i *= 5)

        count += Math.floor(n / i);

    return count;

}

    let n = 100;

    document.write("Count of trailing 0s in " + 100

        + "! is " + findTrailingZeros(n));

</script>

Output

Count of trailing 0s in 100! is 24

Time Complexity: O(log5n)

Auxiliary Space: O(1)

Approach 2 :- Counting the number of factors of 10 Another way to count the number of trailing zeroes in the factorial of a number is to count the number of factors of 10 in that number’s factorial. This is because a trailing zero is added to the factorial every time a factor of 10 is encountered.

    Start the program by including the required header files and the standard namespace.

   Define a function named countTrailingZeroes that takes an integer n as input and returns an integer.

   Initialize a variable named count to 0, which will be used to count the number of trailing zeroes.

   Create a loop that iterates from 1 to n. This loop will be used to calculate the factorial of n.

   Within the loop, initialize a variable named j to the current loop variable i.

   Create another loop that continues until j is no longer divisible by 5. This inner loop is used to count the number of 5s in the prime factorization of i.

   Within the inner loop, increment the count variable and divide j by 5 until j is no longer divisible by 5.

   Return the count variable once the loop completes.

   Define the main function, which sets n equal to 100 and outputs the result of countTrailingZeroes(n).

   End the program by returning 0 from the main function.

In summary, this program calculates the number of trailing zeroes in the factorial of n by counting the number of factors of 5 in the prime factorization of each number from 1 to n.

C++

#include <bits/stdc++.h>

using namespace std;

int countTrailingZeroes(int n)

{

    int count = 0;

    for (int i = 1; i <= n; i++) {

        int j = i;

        while (j % 5 == 0) {

            count++;

            j /= 5;

        }

    }

    return count;

}

int main()

{

    int n = 100;

    cout << countTrailingZeroes(n) << endl;

    return 0;

}

Java

public class Main {

    public static int countTrailingZeroes(int n)

    {

        int count = 0;

        for (int i = 1; i <= n; i++) {

            int j = i;

            while (j % 5 == 0) {

                count++;

                j /= 5;

            }

        }

        return count;

    }

    public static void main(String[] args)

    {

        int n = 100;

        System.out.println(countTrailingZeroes(n));

    }

}

Python3

def countTrailingZeroes(n):

    count = 0

    for i in range(1, n+1):

        j = i

        while j % 5 == 0:

            count += 1

            j //= 5

    return count

n = 100

print(countTrailingZeroes(n))

C#

using System;

class GFG {

    static int countTrailingZeroes(int n)

    {

        int count = 0;

        for (int i = 1; i <= n; i++) {

            int j = i;

            while (j % 5 == 0) {

                count += 1;

                j /= 5;

            }

        }

        return count;

    }

    public static void Main(string[] args)

    {

        int n = 100;

        Console.WriteLine(countTrailingZeroes(n));

    }

}

Javascript

function countTrailingZeroes(n) {

  let count = 0;

  for (let i = 1; i <= n; i++) {

    let j = i;

    while (j % 5 === 0) {

      count++;

      j = Math.floor(j / 5);

    }

  }

  return count;

}

let n = 100;

console.log(countTrailingZeroes(n));

Time Complexity: O(log5n)

Auxiliary Space: O(1)

This article is contributed by Rahul Jain. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

Last Updated :
18 Apr, 2023

Like Article

Save Article

Факториал одной сотни записывается как 100! Это произведение всех натуральных чисел до ста включительно. Иногда запись факториала имеет такой вид:

100 х 99 х 98 х 97 х … х 4 х 3 х 2 х 1

Для ответа на вопрос задачи вам не обязательно находить результат умножения. От вас ждут, чтобы вы лишь определили число нулей в конце произведения, не зная, каким именно оно будет. Для решения этой задачи потребуется сформулировать несколько правил. Одно из них вы уже знаете. Взгляните на следующее выражение.

387 000 х 12 900 = 5 027 131 727

Вам не кажется, что здесь есть что-то забавное? Ведь при перемножении двух круглых чисел, то есть тех, которые оканчиваются на нули, невозможно получить некруглое число. Это нарушило бы закон сохранения конечных нулей (закон, который я только что вывел, но, тем не менее, он является верным). Произведение всегда унаследует нулевые окончания своих составляющих. Вот несколько верных примеров этого:

10 х 10 = 100
7 х 20 = 140
30 х 400 = 12 000

Из сомножителей факториала 100 десять заканчиваются на ноль: 10, 20, 30, 40, 50, 60, 70, 80, 90 и 100 (заканчивается на два 0). Это дает уже как минимум одиннадцать конечных нулей, которые 100! обязательно унаследует.
Предупреждение: следование только этому правилу иногда побуждает некоторых кандидатов в своем ответе заявить, что в конце факториала 100 стоят одиннадцать нулей. Такой ответ является неверным. Иногда можно умножить два числа, не заканчивающихся на ноль, и получить произведение, имеющее в конце один или несколько нулей. Вот несколько примеров этого рода:

2 х 5 = 10
5 х 8 = 40
6 х 15 = 90
8 х 125 = 1000

Все, кроме последней пары, входят в сотню составляющих факториала 100. Поэтому ваша работа не закончилась. Теперь мы подходим к закону «сосисок и булочек». Представьте себе ситуацию, когда на пикник одни люди приносят сосиски (в упаковках по десять штук), другие — булочки (упакованные по восемь штук), а некоторые — и то, и другое. Есть единственный способ, позволяющий определить, сколько хотдогов из этих продуктов можно приготовить. Сосчитайте сосиски, сосчитайте булочки и выберите меньшее число из двух.

Тот же самый закон следует использовать и отвечая на наш вопрос. Для этого надо заменить «сосиски» и «булочки» на «сомножители на 2» и «сомножители на 5».

В каждом из приведенных выше уравнений число, которое делится на 2, умножается на число, которое делится на 5. Сомножители на 2 и на 5 при их перемножении «совместно» дают идеальную десятку, что добавляет еще один ноль к общему произведению. Посмотрите на последний пример, где в конце, можно сказать, из воздуха возникает три нуля.

8 х 125 = (2 х 2 х 2) х (5 х 5 х 5)
= (2 х 5) х (2 х 5) х (2 х 5)
= 10 х 10 х 10
= 1000

Поэтому надо составить пары из двоек и пятерок. Возьмем, к примеру, число, равное 692 978 456 718 000 000.

Оно оканчивается на шесть нулей. Это означает, что его можно записать следующим образом:

692 978 456 718 х 10 х 10 х 10 х 10 х 10 х 10,

или так:

692 978 456 718 х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5).

Первая часть, 692 978 456 718, не делится на 10. В ином случае она бы оканчивалась на ноль, и можно было бы эту часть уменьшить еще в 10 раз. К тому же здесь есть шесть сомножителей, равных 10 (или 2 х 5), что соответствует шести нулям в конце числа 692 978 456 718 000 000. Ну как, убедительно?

Это дает нам надежную систему для определения количества нулей в конце любого большого числа. Выделите сомножители 2 и 5. Составьте из них пары и перемножьте их: (2 х 5) х (2 х 5) х (2 х 5) х … Число пар из двоек и пятерок равно количеству нулей в конце. Закройте глаза на все, что осталось слева.

В целом слева у вас останется двойка или пятерка, для которых не нашлось пары. Обычно это двойки. Более того, когда вы имеете дело с факториалом, это всегда двойки. (В факториалах имеется больше четных множителей, чем множителей, которые делятся на 5.) Поэтому узким местом является число пятерок. Из этого следует, что вопрос можно сформулировать по-другому: сколько раз 100! можно разделить без остатка на 5?

Эту арифметическую операцию можно легко проделать даже в голове. В диапазоне от 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Обратите внимание, что 25 дает 2 множителя, равные 5 (25 = 5 х 5), и к тому же в этой группе есть еще три числа, в состав которых входит 25: 50, 75 и 100. В совокупности это добавляет еще четыре пятерки, а всего их 24. 24 множителя на пять дают 24 пары с равным числом двоек, в результате чего получается 24 множителя на 10 (оставляя слева еще множество двоек, для которых не оказалось пары). Таким образом, в конце 100! будет 24 нуля.

Если вам любопытно узнать точный ответ, то значение факториала 100 равно:

93 326 215 443 944 152 681 699 238 856 266 700 490 715 968 264 381 621 468 592 963 895 217 599 993 229 915 608 941 463 976 156 518 286 253 697 920 827 223 758 251 185 210 916 864 000 000 000 000 000 000 000 000.

Разбор по книге «Действительно ли Вы достаточно умны, чтобы работать в Google?»

3

II. Практическая часть.

Составление и решение задач.

Пример 1. Определить количество нулей в произведении от 1 до 40, т. е. 40!

40! = 1∙2∙3∙4∙ …………∙38∙39∙40

В факториалах имеется больше четных множителей, чем множителей, которые делятся на 5.

Поэтому вопрос можно сформулировать так: сколько раз 40! можно разделить без остатка на 5?

Делятся на 5: 5, 10, 15, 20, 25, 30, 35, 40. В семи числах 5, 10, 15, 20, 30, 35, 40 пятерка

встречается 1 раз, а 25 дает 2 множителя, равных 5 (5∙5). Таким образом, в произведении от 1

до 40 7+2=9 пятерок, т.е. 9 нулей

Пример 2.

Сколькими нулями оканчивается произведение всех натуральных чисел от 17 до 40?

Решение. 20= 4∙5; 25=5∙5; 30=5∙6; 35=5∙7; 40=5∙8. Всего 6 нулей.

Пример 3. Определить количество нулей в произведении от 1 до 100.

Из сомножителей факториала 100 десять заканчиваются на нуль: 10, 20, 30, 40, 50, 60, 70, 80, 90

и 100 (заканчивается на два 0). Это дает уже как минимум одиннадцать конечных нулей.

Следование только этому правилу иногда ведет к ошибке, что в конце факториала 100 стоят

одиннадцать нулей. Такой ответ является неверным.

От 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Из них 25 дает 2

множителя, равные 5 (25 = 5∙5), есть еще три числа, в состав которых входит 25. Это: 50, 75 и

100. В совокупности это добавляет еще четыре пятерки, а всего их 24. Значит, мы получим 24

пары. Таким образом, в конце 100! будет 24 нуля.

Можно рассуждать таким образом.

Делятся на 5: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100. От 1 до 100

имеется 10 чисел, которые оканчиваются на 5 и 9 чисел, оканчивающиеся на 0 и одно число

100, которое оканчивается двумя нулями. Итого: 10+9+2=21. Но 25, 50 и 75 делятся на 25,

значит, они дают еще три пары из чисел 2 и 5. Итого мы получим 21+3=24 пары, т.е. 24 нуля.

Я попробовала усложнить задачу. Как же быть, если большое количество множителей?

Например, найти количество нулей в конце произведении от 1 до 2018.

Сначала находим количество чисел, кратных 5 от 1 до 100. Таких чисел встречается 20. Но

среди этих чисел числа 25, 50, 75, 100 делятся еще на 25, поэтому они дают по две пятерки. В

числе 2018 всего сотен 20. Значит, чисел, кратных 5 всего 400 (20∙20). Числа 2005, 2010, 2015

делятся на 5. Они дают еще три пятерки. Затем находим числа, которые кратны 25.

Кратных 25 всего 80. От 1 до 100 их 4. Тогда 4∙20=80.

Перечислим числа, которые кратны 125: 125, 250, 375, 500, 625, 750, 875, 1000, 1125, 1250,

1375, 1500, 1625, 1750, 1875, 2000. Всего таких чисел 16. Они дают по три пятерки.

Три числа кратных 625: 625, 1250, 1875. Итак, всего пятерок 400+3+80+16+3=502.

Следовательно, 502 нуля в конце произведения от 1 до 2018.

Заключение. Я нашла оптимальный, оригинальный способ решения. Данная работа

предназначена для расширения кругозора обучающихся, она способствует развитию

познавательного интереса к математике. Данный материал может быть использован во

внеклассных мероприятиях по математике. Этот способ позволяет решать задачи такого типа

быстрее, проще, легче.

rumba08
[33.8K]

3 года назад 

Алеся Ясног­орцев­а
[73.7K]

3 года назад 

Произведение всех чисел, предшествующих данному числу, включая и его, называется – факториал числа. Обозначается восклицательным знаком. Например, факториал 15 – 15!

Чтобы вычислить число конечных нулей в факториале 15, не вычисляя сам факториал – надо посмотреть, откуда они возьмутся. Десять там есть, значит, один ноль в конце гарантированно будет. Ну и ещё от умножения числа, оканчивающегося пятёркой на любое чётное число даёт число с нулём на конце. А чисел. оканчивающихся на пять – тут два: 5 и 15, чётных чисел – каждое второе. И значит, два нуля здесь тоже будет. Итого – на конце факториала 15 – три нуля.

система выбрала этот ответ лучшим

комментировать

в избранное

ссылка

отблагодарить

Петро­вич80
[15.9K]

3 года назад 

1×2×3×4×5×6×7×8×9×10­×11×12×13×14×15

Что-бы узнать сколько будет нулей, нужно последовательно умножить все эти числа:

1×2=2, 2×3=6, 6×4=24, 24×5=120, 120×6=720, 720×7=5040, 5040×8=40320, 40320×9=362880, 362880×10=3628800, 3628800×11=39916800, 39916800×12=47900160­0, 479001600×13=6227020­800, 6227020800×14=871782­91200, 87178291200×15=13076­74368000

В результате не хитрых вичислений становится понятно, что количество нулей в конце полученного числа равняется трём.

Ответ: 3 нуля.

комментировать

в избранное

ссылка

отблагодарить

helpa­u
[3.4K]

3 года назад 

Десятичная запись числа будет иметь в конце нули,если в множителях были десятки.В случае 15! там были числа 2,4,6,8,12,14,5,10 и 15,т.е. 10(2*5),10(1*10),60(­4*15). Следовательно, число можно разложить так,чтобы одним из множителем было число 1000. Из этого следует,что запись числа оканчивается 3 нулями.

комментировать

в избранное

ссылка

отблагодарить

alexm­12
[256K]

3 года назад 

Берем калькулятор.

Вычисляем 15!

Получаем 1 307 674 368 000.

На конце три нуля.

комментировать

в избранное

ссылка

отблагодарить

Знаете ответ?

Добавить комментарий