Witam. Na zajęcia muszę napisać program znajdujący liczby zaprzyjaźnione z wprowadzonego przez użytkownika zakresu. Wyszukiwanie tych liczb z zakresu 1-10000 trwało początkowo ok. 10 minut, udało mi się zminimalizować to do 1,5minuty, aczkolwiek ten sam algorytm w c++ wykonuje to zadanie w pół minuty. Liczę na wskazówki dotyczące optymalizacji tego kodu.
function sumd(n: integer): integer;
var i,d,z,sd,sumaz,sumai: integer;
z1,z2,z3: string;
p1,p2,p3,y: extended;
begin
i:=2;
sumaz:=0;
sumai:=0;
while (i*i<n) do
begin
if ((n mod i)=0) then
begin
z1:=IntToStr(i);
p1:=StrToFloat(z1);
z2:=IntToStr(n);
p2:=StrToFloat(z2);
y:=p2/p1;
z3:=FloatToStr(y);
z:=StrToInt(z3);
sumaz:=sumaz+z;
sumai:=sumai+i;
result:=1+sumai+sumaz;
end;
Inc(i);
end;
if (i*i=n) then result:=1+i;
end;
procedure TForm2.Button1Click(Sender: TObject);
var zakres,i,j,suma,x: integer;
begin
zakres:=StrToInt(Edit2.Text);
for i := 200 to zakres do
begin
suma:=sumd(i);
for j := i+1 to zakres do
begin
x:=sumd(j);
if ((x=i) and (j=suma) and (i<>j)) then ListBox1.Items.Add(IntToStr(i)+' '+IntToStr(j));
end;
end;
end;
end.