30/09/2018, 20:02
Thắc mắc Code kiểm tra số nguyên tố
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
int prime(int n);
int main()
{
int n;
printf("Type a number: ");
while((scanf("%d", &n)) != EOF)
{
if (prime(n))// if value is 0 so n is not a Prime number
printf("%d is a Prime number, the value of function return is %d
",n, prime(n));
else
printf("%d is not a Prime number, the value of function return is %d
",n, prime(n));
}
return 0;
}
int prime(int n)
{ // if value is 0 so n is not a Prime number
if (n < 2) return 0;
if (n == 2) return 1;
if (n%2 == 0) return 0;
int divisor = 1;
for (int i = 3; i <= n; i=i+2)
{
if (n%i == 0)
divisor++;
if (divisor > 2)
return 0;
}
return 1;
}
Code này mình vẫn chưa hiểu cho lắm. Nhất là ở chỗ:
if (prime(n))// if value is 0 so n is not a Prime number
printf("%d is a Prime number, the value of function return is %d
",n, prime(n));
else
printf("%d is not a Prime number, the value of function return is %d
",n, prime(n));
Và mấy cái return 0; return 1 nghĩa là gì. Tức là tại sao return 0 thì n không phải SNT, còn return 1 thì N là số NT
Bài liên quan
if (prime(n))
=if(prime(n)==1)
chứ không phải bằng 0 như bạn nghĩ đâuTrong C quy định là bằng 0 là sai, khác 0 là đúng.
À =)) Nhưng mà sao trong bài 32 của playlist C anh Đạt nói là return 0 là không có lỗi, còn khác 0 là có lỗi?
Chỗ đó hình như bạn bị nhầm, anh Đạt nói là return của hàm main .
Còn Code ở trên, hàm prime có nhiệm vụ kiểm tra trạng thái ĐÚNG (1) hoặc SAI (0) nên chỉ trả về giá trị 0, 1 là cái ta cần để biết nó là số ngto hay không là số ngto.
Bạn có thể nói rõ hơn về khái niệm " trạng thái đúng (1) hoặc sai (0) " được không? Tại mình không rõ cái đó lắm, chỉ biết sơ sơ qua cái bài 30 ( IN và OUT ) trong playlist C của anh Đạt thôi !
Cơ bản bạn chỉ cần hiểu nếu 1 hàm check, sẽ có 2 trạng thái: 1 biểu thị cho trạng thái đúng, 0 biểu thị cho sai, một số trường hợp khác thay vì 0, 1 ngta trả về true, false cho dễ hiểu.
Chẳng hạn như hàm prime, khi đưa số n vào, ta chỉ cần biết số đó có là snt hay không , nên return 0/1 mà không return n. Còn vì sao khi 1 thì a là snt là do mình thiết lập hàm: Prime: n là số nguyên tố => nên khi nó đúng (return 1) thì in ra n là snt.
Ngược lại nếu bạn thiết lập hàm: notprime: n không là snt thì khi in ra 1 thì n không là snt.
Cảm ơn bạn nhé! Mà bạn có thể giải thích cho mình cái code cuối được không hơi khó hiểu?
for (int i = 3; i <= n; i=i+2)
{
if (n%i == 0)
divisor++;
if (divisor > 2)
return 0;
}
return 1;
trong cái scope đó thì có return 0 của if rồi, nhưng sau khi ra ngoài scope lại có thêm return 1 nữa, vậy return 1 có tác dụng gì ạ? ( vì nếu n%i = 0 thì tăng số lượng divisor ( ước số ) , nếu divisor > 2 thì sai ( return 0 ), thế là hoàn thành, nhưng ra ngoài lại có thêm 1 cái return 1? )
nếu ko return 1 thì cái hàm prime() chạy i=3 tới n xong chỉ có return 0 thôi à?
cái vòng for đó là để đếm số ước của n. Nếu trong khi đếm mà số ước lớn hơn 2 thì ngừng và trả về 0 tức là n ko phải số nguyên tố. Sau khi chạy xong vòng lặp thì tức là số ước chắc chắn = 2 rồi, phải trả về 1 tức là n là số nguyên tố.
thử chạy tay với n = 11 đi là thấy.
nếu trong qua trình lặp, khi divisor > 2 thì nó sẽ return 0 ngay, kết thúc vòng lặp và kết thúc hàm.
ngược lại, vòng lặp chạy đến vòng cuối cùng mà divisor vẫn không lớn hơn 2 thì nó không return 0 trong vòng lặp, thoát ra khỏi vòng lặp cuối cùng nó sẽ return 1.
mình thấy bài này vòng for không hẳn là để đếm số ước của n, với n có nhiều hơn 3 ước (ví dụ: số 15 có 4 ước) thì cái divisor đâu có đếm đến được. Nó mang giá trị = 3 là max rồi.
đúng rồi, nhưng cái biến đó vẫn mang nghĩa là số ước của n, và cái vòng for vẫn có nghĩa là đếm số ước của n. Khi số ước > 2 thì ngừng thôi. Đếm nữa cũng được nhưng quá 2 ước thì ko phải là số ng tố rồi, khỏi cần đếm nữa.
đúng rồi
nếu ta khai báo hàm
Thì ta có thể trả về return true hay return false. Cái này do ta tự quy định thôi.
đọc code bạn hình như mình bị trừ mất 1 int
Giải thích nhẫm lần
Sau đó trong vòng lập chỉ cần biết nếu biến count tăng giá trị ta dừng luôn còn ngược lại tiếp tục chạy vòng lập.
Cuối cùng kiễm tra biến count có tăng hay không để đưa ra kết luận.
Hàm kiễm tra số nguyên tố thì hiển nhiên tham số đầu vào là số tự nhiên và phải có kết quả trả về. Ta dùng từ khóa return để trả về giá trị mà ta quy định. Ta có thể trả về 10, 20, 30 hay bất kỳ số nguyên nào cũng được và để sử dụng thì ta kiễm tra xem biến mới có bằng giá trị này không thôi.
ví dụ
Có lẽ người hướng dẫn chưa rõ ràng nên dẫn đến sự nhầm lẫn cho một số bạn.
Cảm ơn nhiều nhé! Mình hiểu rồi
Thanks luôn nhé! Mà có cách nào để comment trong Codeblocks mà có dấu không nhỉ, vì khi mình comment có dấu thì nó lỗi, không đánh được
hình như codeblocks có cho lưu file utf-8 mà?
Mà bạn ơi, cho mình hỏi câu cuối nhé.
Ở cuối code sao không phải là return n mà lại return 1?
hàm
int prime(int n)
ở đây tuy là trả về số nguyên nhưng theo người viết thì nó chỉ trả về 2 giá trị: 0 nếu n ko phải là số ng tố, hoặc 1 nếu n là số nguyên tố. Vì C ko có kiểu boolean (đúng/sai) nên phải xài đỡ số nguyên (int) thay cho boolean.thật ra trả về n cũng được, nếu hiểu theo quy ước là
int prime(int n)
trả về 0 nếu n ko phải là số ng tố, còn lại trả về số khác 0 (có thể là 1 hoặc n, hoặc bất kì số nào miễn là khác 0) nếu n là số ng tố.trong C++ thì có kiểu
bool
cũng theo quy ước tương tự khi chuyển từint
vềbool
: nếu giá trị của số nguyên này = 0 thì giá trịbool
tương ứng làfalse
(sai), nếu giá trị của số nguyên khác 0 thì giá trịbool
tương ứng làtrue
(đúng)