Liczby zaprzyjaźnione - optymalizacja

0

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.

2

Nie rozumiem w jakim celu konwertujesz liczby na stringi. Z pewnością taka konwersja wydłuża działanie programu

0

Po co zmieniasz Float na string a później na Integer (i odwrotnie)?

1

zamiast tego ...

          z1:=IntToStr(i);
          p1:=StrToFloat(z1);
          z2:=IntToStr(n);
          p2:=StrToFloat(z2);
          y := p2 / p1;
      
          z3 := FloatToStr(y);
         z := StrToInt(z3);
         

wystarczy jeden wiersz

              z := n div  i;

EDT..
przetestowałem oba warianty dla parametru 10000, pierwszy czas wykonania 2 min. 25 sek., drugi 18 sek.

1

Do tego co napisał @grzegorz_so jeszcze użyj:

 ListBox1.Items.BeginUpdate;
//tu kod z petlą for i := 200 to zakres do
 ListBox1.Items.EndUpdate;

1 użytkowników online, w tym zalogowanych: 0, gości: 1