# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Chương trình con kiểm tra 1 số có là số nguyên tố hay không

## hoaican

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;

----------


## vAPK

Mình đã hiểu phải sửa lại chương trình trên như sau:


```
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:=N>1;
End;
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ư trên
```

----------


## thanducha

Hay lắm, cái này mình cũng mới học, không hiểu vì sao hết

----------


## nguyentientu4497

c¸i ®Êy rë ch¹y c¸i nµy nµy
function ktnt(i:integer):boolean;
dem:=0;
for j:=1 to i do
 if i mod j = 0 then inc(dem);
if dem=2 then ktnt:=true else ktnt := false;
end;

----------


## dunghoang

> 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;


thêm cái dk if n<2 then exit . Cái này đâu phải kĩ thuật lập trình .

----------


## leanhseomxh

> c¸i ®Êy rë ch¹y c¸i nµy nµy
> function ktnt(i:integer):boolean;
> dem:=0;
> for j:=1 to i do
>  if i mod j = 0 then inc(dem);
> if dem=2 then ktnt:=true else ktnt := false;
> end;


Đây là thuật toán cơ bản nhưng thuật toán này chạy lâu lắm.
Với những số lớn thì thuật toán này không tối ưu.

----------


## vomaiduyphuong

> Mình đã hiểu phải sửa lại chương trình trên như sau:
> 
> 
> ```
> Function ngto(N:integer):boolean;
> Var i:integer;
> Begin
> ngto:=false;
> For i:=2 to trunc(sqrt(N) ) do 
> ...




```
Hay lắm, tui thích nhất cái khoản ngto:=N>1; vừa gọn vừa dễ nhìn
```

[/QUOTE]

----------


## Lpthuylieu

> Hay lắm, tui thích nhất cái khoản ngto:=N>1; vừa gọn vừa dễ nhìn


Nhưng mà khó hiểu vì ngto nhận kiểu Boolean mà N lại là số.
Ah biểu thức N>1 nghĩa là True với N > =2. ĐÚng rồi

----------


## thegioibang

Mình đưa ra 1 đoạn chương trình, bạn tự viết vào mođun nha:
i:=2;
while a{số cần kt} mod i<>0 then inc(i);
if a=i then true else false.
:shifty:
Có gì sai sót xin chỉ bảo:emlaugh:

----------


## hyundaivt

procedure KT(x:integer);
var d,i:integer;
begin
d:=0;
for i:=2 to x-1 do
if x mod i=0 then d:=d+1;
if d=0 then write(x,'la so nguyen to') else write(x,'k la so nguyen to');
end;

----------


## fantasysl06

> procedure KT(x:integer);
> var d,i:integer;
> begin
> d:=0;
> for i:=2 to x-1 do
> if x mod i=0 then d:=d+1;
> if d=0 then write(x,'la so nguyen to') else write(x,'k la so nguyen to');
> end;


bạn nên cho chạy đến trunc(sqrt(x)) để ct chạy nhanh hơn [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## hongson1992

Bạn Việt Đức ơi, bạn tính sử dụng thủ tục theo kiểu true false à? (d=0,d=1)[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Nếu vậy bạn nên để biến d thành biến boolean để thể hiển rõ chương trình hơn, dùng function nhé, ví dụ:
function test(x:integer):boolean;
var i:integer;
begin
i:=2;
while x mod i<>do inc(i);
if i=x then test:=true else test:=false;
end;
_ Có lẽ như vậy sẽ dễ hiểu hơn bạn ạ!:botay:_
*Thân.*

----------


## muabanxe

binhnguyen đọc code k hỉu ùi . d là biến đếm ước của n ( k tính 1 và chính nó ). Nếu d=0 thì n là số nguyên số ngược lại

----------


## sudo

*Giải bài tập pascal*




> 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;


các bác ơi giải hộ em bài này với: Viết chương trình pascal Tính tổng các số nguyên tố từ 1 đến 3000 dùng chương trình con mai e phải nộp rùi mong các bác nhanh hộ em

----------


## htkkplus

```
Var i,S:Integer;
Function sont(x:integer):boolean;
Begin
sont:=(x>1);
For i:=2 to trunc(sqrt(x)) do 
    if x mod i=0 then
     Begin
        sont:=false;
        break;
    End;
End;
BEGIN
S:=0;
For i:=1 to 3000 do 
  if sont(i)=True then S:=S+i;
write('tong la:',S);
Readln
END.
```

----------

