Определить натуральное число, не большее заданного n с наибольшим числом простых делителей - Free Pascal
Формулировка задачи:
Определить натуральное число не большее заданного n с наибольшим числом простых делителей. Использовать функцию вычисления количества простых делителей числа.
Решение задачи: «Определить натуральное число, не большее заданного n с наибольшим числом простых делителей»
textual
Листинг программы
function OnePrimary(D : Integer; var N : Integer) : Integer;
begin
while N mod D = 0 do
N := N div D;
Result := 1;
end;
function PrimaryDiv(N : Integer) : Integer;
begin
Result := 0;
if not odd(N) then
Result += OnePrimary(2, N);
var D := 3;
while N > 1 do
begin
if N mod D = 0 then
Result += OnePrimary(D, N);
D += 2;
end;
end;
begin
var N := ReadLnInteger('N = ');
var maxN := 0; var maxD := 0;
for var i := 1 to N do
begin
var PD := PrimaryDiv(i);
if PD > maxD then
begin
maxN := i; maxD := PD;
end;
end;
WriteLnFormat('Натуральное число {0} не большее {1} имеет наибольшее число простых делителей: {2}', maxN, N, maxD);
end.
Объяснение кода листинга программы
- Первый шаг - это функция OnePrimary(D; N), которая принимает два аргумента: D (делитель) и N (число), и возвращает 1, если N делится на D без остатка, и ноль в противном случае. Эта функция используется в функции PrimaryDiv для определения простых делителей числа N.
- Функция PrimaryDiv(N) принимает одно число N и возвращает число, которое представляет собой сумму всех простых делителей числа N. Она начинается с проверки, является ли N четным числом. Если это так, то она вызывает функцию OnePrimary с делителем 2, чтобы учесть случаи, когда N является четным числом и имеет только один простой делитель.
- Затем она инициализирует переменную D равной 3 и входит в цикл, который продолжается до тех пор, пока N больше 1. В каждой итерации цикла она проверяет, делится ли N на D без остатка. Если это так, то она вызывает функцию OnePrimary с делителем D и добавляет результат к общей сумме простых делителей.
- После завершения цикла функция PrimaryDiv возвращает общую сумму простых делителей числа N.
- Основная программа начинается с чтения числа N от пользователя с помощью функции ReadLnInteger.
- Затем она инициализирует две переменные: maxN (максимальное число) и maxD (максимальное количество простых делителей), обе равные нулю.
- Она входит в цикл, который продолжается N раз. В каждой итерации цикла она вызывает функцию PrimaryDiv с текущим числом i и сохраняет результат в переменную PD.
- Затем она проверяет, больше ли PD, чем maxD. Если это так, то она обновляет maxN и maxD значениями PD и i соответственно.
- После завершения цикла программа выводит на экран строку формата, используя функцию WriteLnFormat, которая сообщает найденные значения maxN, N и maxD.
- Наконец, программа завершается.