Знайти найбільший нетривіальний дільник натурального числа

Формулювання. 
Дано натуральне число. Знайти його найбільший нетривіальний дільник або вивести одиницю, якщо такого немає.

Примітка 1: дільником натурального числа a називається натуральне число b, на яке a ділиться без залишку. Тобто вираз «b - дільник a» означає: a / b = k, причому k - натурального число.
Примітка 2: нетривіальним дільником називається дільник, який відрізняється від 1 і від са-мого числа (так як на одиницю і саме на себе ділиться будь-яке натуральне число).

Рішення. 
Нехай введення з клавіатури здійснюється в змінну n. Спробуємо вирішити задачу перебором чисел. Для цього візьмемо число на одиницю меншу n і перевіримо, чи ділиться n на нього. Якщо так, то виводимо результат і виходимо з циклу за допомогою оператора break. Якщо ні, то знову зменшуємо число на 1 і продовжуємо перевірку. Якщо у числа немає нетривіальних дільників, то на якомусь кроці перевірка дійде до одиниці, на яку число гарантовано по-ділиться, після чого буде виданий відповідна умові відповідь.
Хоча, якщо говорити точніше, слід було б почати перевірку з числа, рівного n div 2 (щоб відкинути дробову частину при діленні, якщо n непарне), так як жодне натуральне число не має дільників більших, ніж половина  цього числа. В іншому випадку частка від ділення має бути натуральним числом між 1 і 2, якого просто не існує.
Дане завдання також вирішується через for, але через інши1 його різновид, і тепер лічильник буде спадати від n div 2 до 1. Для цього do заміниться на downto, а позиції початкового та кінцевого значень залишаються тими ж.
Алгоритм природною мовою:
1) Введення n;
2) Запуск циклу, при якому i змінюється від n div 2 до 1. У циклі:
1. Якщо n ділиться на i (тобто, залишок від ділення числа n на i дорівнює 0), то виводимо i на екран і виходимо з циклу за допомогою break.
program GreatestDiv;
var
i, n: word;
begin
readln(n);
for i := n div 2 downto 1 do begin
if n mod i = 0 then begin
writeln(i);
break
end
end
end.

Немає коментарів:

Дописати коментар