Я подправил ваш код. (Yamatem) Перед циклами надо было обнулять переменные суммы и делителей. И подправил условия циклов repeat until.
until k <> a div 2; - так лучше не писать, лучше использовать знаки больше или меньше. И вот что тут получается логически: пока не (k <> a div 2) или пока (k = a div 2). Т.е. надо было разобраться с логическими выражениями.
Еще я добавил
if b<>s then continue; вместо того, что было.
И поправил инициализацию самого первого цикла. Было 220, поменял на 300.
И еще сам написал не смотря на вашу программу свой код и результаты у нас теперь одинаковые.
Я тоже не брал одинаковые числа. В своем коде я сужал промежуток делителей.
Code
var
a,b,k,s,m,d:integer;
begin
k:=0;
s:=0;
d:=0;
m:=0;
For b:=1 to 299 do
for a:=(b+1) to 300 do
begin
k := 0;
s := 0;
repeat
k:=k+1;
if a mod k = 0 then s:=s+k;
until k > a div 2;
if b<>s then continue;
d := 0;
m := 0;
repeat
d:=d+1;
if b mod d = 0 then m:=m+d;
until d > b div 2;
if (b=s)and(a=m) then
{if a=m then}
writeln(a,' ',b)
end;
end.
Мой код:
Code
program forum_druzh_chisla;
uses crt;
var
a, b: integer;
s1, s2, i: integer;
n: integer;
begin
clrscr;
for a := 2 to 299 do
for b := a + 1 to 300 do
begin
if odd(a) then n := a div 3 else n := a div 2;
s1 := 0;
for i := 1 to n do
if a mod i = 0 then s1 := s1 + i;
if b <> s1 then continue;
if odd(b) then n := b div 3 else n := b div 2;
s2 := 0;
for i := 1 to n do
if b mod i = 0 then s2 := s2 + i;
if (a = s2) and (b = s1) then writeln('a = ', a, '; b = ', b);
end;
readkey;
end.