Заметим, что число нулей в записи числа = максимальная степень десятки, на которую делится число = минимальная из степеней двойки и пятерки, входящих в разложение на простые множители этого числа. [Первое равенство очевидно, второе можно доказать от противного] Например, 7500 имеет на конце 2 нуля: 7500 = 2^2 * 3 * 5^4 - минимальная из степеней двойки и пятерки как раз 2.
В разложении числа N! на простые множители пятерок всегда не больше, чем двоек: если в выражении N!=1*2*3*.,,*N есть множитель вида m*5^k, то есть и множитель m*2^k - хотя бы потому, что второе число меньше первого, а факториал - это произведение всех чисел меньше заданного. Поэтому при разложении на простые множители степень двойки хотя бы степень двойки. Используя наблюдение из первого параграфа, получаем: Число нулей в конце десятичной записи числа N! совпадает с числом пятерок в разложении числа N! на простые множители.
Остается найти число пятерок в разложении. Проще всего это понять на примере. 26! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * 25 * 26
Число чисел, делящихся на 5, среди первых 26 чисел равно пяти (это 5, 10, 15, 20, 25). Это число можно найти, округлив вниз результат от деления 26/5. Если подумать, можно понять, что в разложении 26! на простые множители 5 встретится не 5 раз - мы забыли учесть число 25, которое даст не одну пятерку, а две. И вообще, в ответ сомножитель что-то*5^n будут давать n пятерок.
Итого ответ для произвольного N: [N/5] + [N/5^2] + [N/5^3] + ...
Алгоритм: c = 0 пока [N/5] > 0: увеличиваем c на [N/5] N = [N/5] вывод c
Питон-3: N = int(input()) c = 0 while N//5 > 0: c += (N//5) N = N//5 print(c)
Const maxElements = 1000; var arr : array[1..maxElements, 1..maxElements] of integer; counterArray : array[1..maxElements] of integer; i, j, n, m, countOfPositive: integer; begin write('Введите количество строк: '); readln(n); write('Введите количество столбцов: '); readln(m); writeln('Введите элементы массивы'); for i:=1 to n do for j:=1 to m do read(arr[i,j]);
countOfPositive := 0; for j:=1 to m do begin for i:=1 to n do if arr[i,j] > 0 then Inc(countOfPositive); counterArray[j] := countOfPositive; countOfPositive := 0; end; writeln('Количество положительных элементов в каждом столбце'); for j:=1 to m do write(counterArray[j], ' '); end.
Например, 7500 имеет на конце 2 нуля: 7500 = 2^2 * 3 * 5^4 - минимальная из степеней двойки и пятерки как раз 2.
В разложении числа N! на простые множители пятерок всегда не больше, чем двоек: если в выражении N!=1*2*3*.,,*N есть множитель вида m*5^k, то есть и множитель m*2^k - хотя бы потому, что второе число меньше первого, а факториал - это произведение всех чисел меньше заданного. Поэтому при разложении на простые множители степень двойки хотя бы степень двойки. Используя наблюдение из первого параграфа, получаем:
Число нулей в конце десятичной записи числа N! совпадает с числом пятерок в разложении числа N! на простые множители.
Остается найти число пятерок в разложении. Проще всего это понять на примере.
26! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * 25 * 26
Число чисел, делящихся на 5, среди первых 26 чисел равно пяти (это 5, 10, 15, 20, 25). Это число можно найти, округлив вниз результат от деления 26/5.
Если подумать, можно понять, что в разложении 26! на простые множители 5 встретится не 5 раз - мы забыли учесть число 25, которое даст не одну пятерку, а две. И вообще, в ответ сомножитель что-то*5^n будут давать n пятерок.
Итого ответ для произвольного N: [N/5] + [N/5^2] + [N/5^3] + ...
Алгоритм:
c = 0
пока [N/5] > 0:
увеличиваем c на [N/5]
N = [N/5]
вывод c
Питон-3:
N = int(input())
c = 0
while N//5 > 0:
c += (N//5)
N = N//5
print(c)
maxElements = 1000;
var arr : array[1..maxElements, 1..maxElements] of integer;
counterArray : array[1..maxElements] of integer;
i, j, n, m, countOfPositive: integer;
begin
write('Введите количество строк: ');
readln(n);
write('Введите количество столбцов: ');
readln(m); writeln('Введите элементы массивы');
for i:=1 to n do
for j:=1 to m do
read(arr[i,j]);
countOfPositive := 0;
for j:=1 to m do
begin
for i:=1 to n do
if arr[i,j] > 0 then Inc(countOfPositive);
counterArray[j] := countOfPositive;
countOfPositive := 0;
end;
writeln('Количество положительных элементов в каждом столбце');
for j:=1 to m do
write(counterArray[j], ' ');
end.