Pobieranie zmiennej oraz program na liczby doskonałe

0

Cześć, mam pytanie jak zrobić, aby nie było konfliktu między Integerem i Extended (przy pętli for) oraz czy ten kod ma sens na szukanie liczb doskonałych.

var a , c, g, d, s, f, i: Integer;
k : String ;
b : Extended;
begin
  k:=Edit1.Text;
  g :=StrToInt(k);
  a := 0;
  b := 1/2;
  val (k,g,d);
  while (a < g) do
              begin
                for i := 1 to b do
                     begin
                     if (b mod i) = 0 then
                      begin
                      s:= s+I;
                      end;
                     end;
              if s = b then
                     begin
                        a:=Memo1.GetTextLen;
                        a:= a + 1;
                     end;
               s:=0;
          end;
     end;
end.
2

W szukaniu liczb doskonałych użycie zwykłych typów danych w sposób powiedzmy to jawny na dużo się nie przydaje. Tak naprawdę po chwili kończy się zakres tych typów. Jednak oczywiście można się chwilę pobawić, myślę że 6 pierwszych liczb jak będziesz miał cierpliwość obliczysz.
Ja bym to zrobił tak:

unit Unit1;

interface

uses
  System.SysUtils,
  System.Classes,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.StdCtrls,
  System.TimeSpan,
  System.Diagnostics;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    mmo1: TMemo;
    btn1: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  n, limit, count, c, total: LongInt;
  iteration: Integer;
  Stopwatch: TStopwatch;
  Elapsed: TTimeSpan;
  Seconds: Double;
begin
  Stopwatch := TStopwatch.StartNew;
  Application.ProcessMessages;
  mmo1.Text := '';
  count := 0;
  n := 1;
  iteration := StrToIntDef(edt1.Text, 1);
  while (count < iteration) do
  begin
    total := 1;
    inc(n);
    limit := trunc(sqrt(n));
    for c := 2 to limit do
    begin
      if (n mod c = 0) then
        total := total + c + (n div c);
    end;
    if (total = n) then
    begin
      Elapsed := Stopwatch.Elapsed;
      Seconds := Elapsed.TotalSeconds;
      mmo1.Lines.Add('mineło: ' + FloatToStr(Seconds) + ' sek.' + ' liczba: ' + n.ToString);
      inc(count);
    end;
  end;
end;

end.

Zrzut ekranu 2021-11-13 122708.png

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