Hiển thị kết quả từ 1 đến 10 / 14
-
04-07-2009 22:01 #1
DDTH.com
- Tham gia
- 23-06-2009
- Location
- Huyện Gia Bình - Tỉnh Bắc Ninh
- Bài viết
- 323
- Like
- 0
- Thanked 4 Times in 4 Posts
Chương trình con kiểm tra 1 số có là số nguyên tố hay không
Các bạn hãy viết các cách để kiểm tra 1 số có là số nguyên tố hay không (dùng chương trình con.
Trong nhiều sách mình thấy dùng hàm sau nhưng mình chạy với số 1 thì in ra là số nguyên tố. Các bạn đọc và cho ý kiến nhé
Function ngto(N:integer):Boolean;
Var i:integer;
Begin
ngto:=false;
For i:=2 to trunc(sqrt(N)) do
if N mod i = 0 then exit;
ngto:=true;
End;
-
04-07-2009 23:32 #2
Thay dòng ngto:=true; bằng dòng ngto:=N>1; (đoạn chương trình trên chỉ kiểm tra xem 1 số có ước khác 1 và chính nó ko)
-
05-07-2009 14:25 #3
DDTH.com
- Tham gia
- 23-06-2009
- Location
- Huyện Gia Bình - Tỉnh Bắc Ninh
- Bài viết
- 323
- Like
- 0
- Thanked 4 Times in 4 Posts
Mình đã hiểu vì sao đoạn CTC trên chạy lại cho kết quả 1 là số nguyên tố vì với N=1 ban đầu ngto:=false
Sau đó thì vòng for không được thực hiện vì i chạy từ 2 đến... vì vậy không có lệnh Exit thoát khỏi chương trình con. Và cuối cùng hàm ngto lại gán bằng true ngto:=true. Vậy 1 sẽ là số nguyên tố. Cần sửa lại như bạn mr_invincible là đúng. Thanks
-
13-07-2009 22:55 #4
DDTH.com
- Tham gia
- 23-06-2009
- Location
- Huyện Gia Bình - Tỉnh Bắc Ninh
- Bài viết
- 323
- Like
- 0
- Thanked 4 Times in 4 Posts
Cách này kiểm tra được cả số 1. Nhưng cách này thời gain thực hiện sẽ lâuCode:Function ngto(N:integer):Boolean; Var d,i:integer; Begin d:=0; For i:=1 to n do If n mod i=0 then inc(d); if d=2 then ngto:=true else ngto:=false; End;
-
14-07-2009 07:16 #5
nói thật đến bây giờ mình vẫn chưa biết cài đặt sàng số nguyên tố sao cho tốt , bạn nào cho ý tưởng đi
-
14-07-2009 08:30 #6
Registered User
- Tham gia
- 13-12-2008
- Location
- Vũng Tàu
- Bài viết
- 393
- Like
- 0
- Thanked 2 Times in 2 Posts
-
16-07-2009 15:41 #7
còn có thể cải tiến được nữa đấy bạn ạh
vòng for làm cho i có thể là số chẵn,
mình đề nghị dùng vòng repeat .. until
chỉ phải ktra ban đầu với giá trị i=2;
sau đó i=3, qua mỗi vòng lặp thì inc(i,2);
-
16-07-2009 15:54 #8
DDTH.com
- Tham gia
- 23-06-2009
- Location
- Huyện Gia Bình - Tỉnh Bắc Ninh
- Bài viết
- 323
- Like
- 0
- Thanked 4 Times in 4 Posts
Code:Function nt(x:integer):boolean; Var i:integer; Begin nt:=true; For i:=2 to trunc(sqrt(x)) do if x mod i =0 then nt:=false; End;
[=========> Bổ sung bài viết <=========]
Có thể qua mỗi vòng lặp tăng i lên 2 sẽ bớt thời gian thực hiện. Vì ko bao giờ có 2 số tự nhiên liên tiếp cùng là nguyên tố đúng ko bạn nhỉ
[=========> Bổ sung bài viết <=========]
Code:Function nt(x:integer):boolean; Var i:integer; Begin if (x=2) or (x=3) then nt:=true else nt:=false; i:=2 repeat if x mod i then exit else inc(i,2); until i=trunc(sqrt(x)); nt:=N>1; End;
[=========> Bổ sung bài viết <=========]
Cũng ko cần kiểm tra x=2 or x=3 vấn đúng.Kiẻm tra TH N=1;
Function nt(x:integer):boolean;
Code:Var i:integer; Begin if x=1 then nt:=false;exit; nt:=false; i:=2 repeat if x mod i then exit else inc(i,2); until i=trunc(sqrt(x)); nt:=true; End;Được sửa bởi lehang_gb1 lúc 16:17 ngày 16-07-2009 Reason: Bổ sung bài viết
-
16-07-2009 18:44 #9
Bạn lehang viết bằng TP à?
FP viết dễ hơn:
PHP Code:Function NT(n:Cardinal):Boolean;
Var i:Cardinal;
Begin
i:=2;
If N<=1 then Exit(False)
Else While i<=Trunc(Sqrt(N))do
Begin
If N mod i = 0 then Exit(False);
i+=2;
End;
Exit(True);
End;
-
16-07-2009 20:04 #10


Quote

Bookmarks