Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit LiczbyFermataSC;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, System.Math,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
- type
- TForm1 = class(TForm)
- Label1: TLabel;
- Button1: TButton;
- Edit1: TEdit;
- ListBox1: TListBox;
- Label2: TLabel;
- Edit2: TEdit;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- {13. Napisz program znajdujący liczby pierwsze Fermata w
- zadanym przedziale [1, max]. Liczbą pierwszą Fermata nazywamy
- liczbę pierwszą x, którą można przedstawić w postaci:
- x=2^(2^n)+1 (n=1,2,3,...).
- Początkowe liczby pierwsze Fermata: 3, 5, 17, 257, ...}
- procedure TForm1.Button1Click(Sender: TObject);
- var
- Max,I: Integer;
- Liczba, Licznik: Extended;
- CzyPierwsza, Error: Boolean;
- start,stop:TDateTime;
- h,m,s,ms:word;
- begin
- ListBox1.Clear;
- //Obsługa wyjątków************************************************************
- Error:=false;
- try
- Max:=StrToInt(Edit1.Text);
- except
- On EConvertError do
- begin;
- Error:=true;
- showmessage('Błąd! Wartość maksymalna przedziału powinna być liczbą całkowitą');
- end;
- end;
- if Max<1 then
- begin;
- Error:=true;
- showmessage('Błąd! Należy podać liczbę większą od zera');
- end;
- //****************************************************************************
- //Obliczanie Liczb Fermata****************************************************
- if Error=false then
- begin;
- start:=time;
- try;
- for I := 1 to Max do
- begin;
- Liczba:=Power(2,Power(2,I))+1;
- //Sprawdzenie czy obliczona liczba jest liczbą pierwszą*****************
- CzyPierwsza:=false;
- Licznik:=2;
- while Licznik<sqrt(Liczba) do
- begin;
- if frac(Liczba/Licznik)=0 then
- begin;
- CzyPierwsza:=true;
- Break;
- end;
- Licznik:=Licznik+1;
- end;
- if CzyPierwsza=false then ListBox1.Items.Add(FloatToStr(Liczba));
- end;
- //Oliczanie czasu*********************************************************
- stop:=time;
- DecodeTime(stop-start,h,m,s,ms);
- Edit2.Text:=inttostr(s)+' s '+inttostr(ms)+' ms';
- except
- On E : EOverflow do
- begin;
- showmessage('Błąd! Zbyt duża wartość przedziału dla operacji na liczbach zmiennoprzecinkowych');
- end;
- end;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement