Консультация № 75712
14.02.2007, 16:06
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты.
Помогите, пожалуйста, с такой задачей.

Дружественные числа. Два числа называются дружественными, если сумма делителей (включая 1, но не включая само число), каждого из них равна другому. Составить эффективную программу, находящую пары дружественных чисел в диапазоне от 1 до 1000. Подсказка – эффективная программа использует из арифметических операций только сложение.

Спасибо.

Обсуждение

Неизвестный
14.02.2007, 17:13
общий
это ответ
Здравствуйте, Гусев Денис!
Хорошая задачка для раздела "программирование нетривиальных задач" =)
Насколько мне известно, операция сравнения тоже является арифметической и без нее задачу решить невозможноНо, я думаю, эту операцию все-таки можно использовать.
Функция проверки, делится ли A на B: AdivisableByB (в приложении)
Если честно, то мне всегда проще написать код, чем объяснять, что да как, так что вот пример.
Перебираете делители и считаете их сумму в двух вложенных циклах (для всех пар чисел от 1 до 1000):
<code>for i := 1 to 1000 do begin
for j := 1 to i do begin // либо до i-1, если числа в дружественной паре должны быть различны
si := 0;
sj := 0;
for k := 1 to i do if AdivisableByB(i, k) then inc(si, k);
for k := 1 to j do if AdivisableByB(j, k) then inc(sj, k);
if (si = j) and (sj = i) then;
{ на данный момент в i и j у нас находится пара дружественных чисел.
мы можем сделать с ними что захотим. Например, вывести на экран }
end;
end;</code>
PS: Компилировать не пробовал, но идея из кода должна быть совершенно ясна.

Приложение:
function AdivisableByB(a, b: integer): booleanvar i: integer;begin i := 0; while (i <= a) do inc(i, b); // i := i + b; AdivisableByB := (i = a); // Result := (i = a);end;
Форма ответа