Перевірити, чи є два натуральних числа дружніми

Формулювання. 
Дано два натуральних числа. Перевірити, чи є вони дружніми.

Примітка: 
дружніми числами називаються два різних натуральних числа, для яких сума всіх власних дільників першого числа дорівнює другому числу і сума всіх власних дільників другого числа дорівнює першому числу.
Наприклад, 220 і 284 - пара дружніх чисел, тому що:
Сума власних дільників 220: 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
Сума власних дільників 284: 1 + 2 + 4 + 71 + 142 = 220

Рішення. 
Нам потрібно знайти не тільки суму власних дільників першого числа (позначимо число як n1, а суму його дільників sum1), але і другого числа (візьмемо позначення n2 і sum2 відповідно). Тоді відповіддю в задачі послужить порівняння: (n1 = sum2) and (n2 = sum1). Тут ми використовуємо логічні операції (нагадаємо, що логічне вираження X1 and X2 приймає значення істини тоді і тільки тоді, коли істинні булевські вирази X1 і X2, а в інших випадках воно приймає помилкове значення).
Однак запропоновану схему можна спростити. 
Покажемо це на прикладі:
нехай дано числа 8 і 4. 
Вважаємо суму власних дільників числа 8: 1 + 2 + 4 = 7. Це число відмінне від 4, тому пара вже не відповідає визначенню дружніх чисел. 
Можна відразу вивести негативну відповідь, уникнувши підрахунку суми дільників другого числа. 
Якщо були б дані числа 8 і 7, то необхідно було б обчислити суму власних дільників числа 7, вона дорівнює 1 (так як воно просте). Тепер необхідно порівняти суму власних дільників другого з першим числом: так як 1 відмінно від 8, цифри не дружні.
program AmicableTest;
var
i, n1, n2, sum1, sum2: word;
begin
readln(n1, n2);
for i := 1 to n1 div 2 do begin
if n1 mod i = 0 then sum1 := sum1 + i
end;
if sum1 = n2 then begin
for i := 1 to n2 div 2 do begin
if n2 mod i = 0 then sum2 := sum2 + i
end;
writeln(sum2 = n1)
end
else begin
writeln('False')
end
end.

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

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