[Help] Kiểm tra n có phải là số nguyên tố hay k?

tình hình là làm xong mà nhập số 3 vs 5 nó bảo k phải là số nguyên tố!:sogood:
xin các huynh chỉ giáo giúp.e new zo nên còn gà!:D:D

#include <stdio.h>
#include <conio.h>
void main()
{
int n,i,s=0;
printf(“nhap gia tri cua n”);
scanf(“%d”,&n);
for (i=1;i<=n;i=i+1);
{
if(n%i==0) s=s+1;
}
if(s==2) printf(“so da cho la so nguyen to”);
else printf(“so da cho k phai la so nguyen to”);
}

Đoạn code của e có thể hiểu là:

  • Nhập số n, cho i chạy từ 1 tới n, nếu n chia hết cho i thì tăng s 1 đơn vị. s = 2 thì nó là snt còn khác 2 thì nó ko phải số nguyên tố…

  • Còn số nguyên tố là số chia hết cho 1 và chính nó.

Hai cái trên ko ăn nhập gì với nhau cả.

Như vậy e đã thấy mình sai gì chưa :slight_smile:

có ăn nhập đó anh. nếu cho i chạy từ 1 tới n thì đơn nhiên nếu là số nguyên tố thì nó phải chia hết cho 1 và n thì lúc đó s mới =2 được. còn nếu không phải là số nguyên tố thì s phải lớn hơn 2. còn bài của bạn thì đúng rồi, chỉ cần bỏ dâu ; sau hàm for là được. vì khi bạn viết dấu ; sau hàm for thì nó hiểu là đã kết thúc hàm for. vậy thì hàm if… sau nó ko thuộc hàm for nên s vẫn = 0 cho nên nó báo ko phải là số nguyên tố rồi. [QUOTE=10520121;161553]Đoạn code của e có thể hiểu là:

  • Nhập số n, cho i chạy từ 1 tới n, nếu n chia hết cho i thì tăng s 1 đơn vị. s = 2 thì nó là snt còn khác 2 thì nó ko phải số nguyên tố…

  • Còn số nguyên tố là số chia hết cho 1 và chính nó.

Hai cái trên ko ăn nhập gì với nhau cả.

Như vậy e đã thấy mình sai gì chưa :)[/QUOTE]

hì.thế mà mình k thấy…cứ tưởng {} là no nằm trong for chứ.:sogood:
tks bạn nhé.:kiss:

nếu n là số lớn thì vòng for phải lặp rất nhiều, n = 7919 thì vòng for lặp 7919 lần.
for(int i = 1; i<= n && s<=3; i++){}

[QUOTE=12520471;161551]tình hình là làm xong mà nhập số 3 vs 5 nó bảo k phải là số nguyên tố!:sogood:
xin các huynh chỉ giáo giúp.e new zo nên còn gà!:D:D[/QUOTE]
Bạn có thể tham khảo thêm cách làm như sau. Có rất nhiều cách thể hiện, sau đây bonus cho bạn 1 cách:

int main()
{
int n, i;
bool SNT = false;
printf("
Nhap vao N: “);
scanf(”%d",&n);
if (n > 1)
{
SNT = true;
for (i = 2; i <= n/2; i++)
if(n % i == 0)
{
SNT = false;
break;
}
}
if (SNT == true)
printf(“%d la so nguyen to!”,n);
else
printf(“%d khong la so nguyen to.”);
return 0;
}

theo ý kiến của mình thì nên để vòng for(int i=1;i<sqrt(n);i++)
như thế thì vòng lặp cũng đã lớn lắm rồi
và nhớ là phải ép kiểu dữ liệu về số nguyên (int) khi tính căn

[QUOTE=11520579;161588]theo ý kiến của mình thì nên để vòng for(int i=1;i<sqrt(n);i++)
như thế thì vòng lặp cũng đã lớn lắm rồi
và nhớ là phải ép kiểu dữ liệu về số nguyên (int) khi tính căn[/QUOTE]

vậy trường hợp số cực lớn (phải lưu = chuỗi) thì dùng sqrt ra sao :slight_smile:

[QUOTE=08520195;161607]vậy trường hợp số cực lớn (phải lưu = chuỗi) thì dùng sqrt ra sao :)[/QUOTE]
Với các số lớn thì có thể dùng sàng Eratosten để kiểm tra số nguyên tố, nhưng số lớn đến nỗi phải lưu = chuỗi thì không biết làm thế nào :smile: Anh biết thì có thể chia sẻ được không ạ :pudency:

Theo mình thì còn 1 cách đó là: Số nguyên tố thì ko chia hết cho các số 2, 3, 5,7 với yêu cầu số đó lớn hơn 7

Vớ vẩn…thế thì nếu số đó là tích của 2 số nguyên tố lớn hơn 7 thì sao? 143 chẳng hạn…=))

[QUOTE=09520652;161830]Theo mình thì còn 1 cách đó là: Số nguyên tố thì ko chia hết cho các số 2, 3, 5,7 với yêu cầu số đó lớn hơn 7[/QUOTE]
121 không chia hết cho 2,3,5,7 nhưng đâu phải số nguyên tố anh :nosebleed:

[QUOTE=12520527;161859]121 không chia hết cho 2,3,5,7 nhưng đâu phải số nguyên tố anh :nosebleed:[/QUOTE] bạn hiểu sai ý rồi, câu ảnh nói ý là đó phải là SỐ NGUYÊN TỐ trước thì sau đó mới thỏa việc không chia hết cho 2,3,5,7 với số đó phải lớn hơn 7 ;còn bạn thì lấy đại 1 số không chia hết cho 2,3,5,7 nhưng chia hết cho 11 nếu bạn lấy 187 cũng thế vậy. mà theo anh đó thì cách đó mình cũng không nghĩ ra cách viết như thế nào!

Có lẽ ý của bạn 652 là như thế này:
Đơn giản xét 2 số 2 và 3 thôi. Đã là số ngto(> 2, 3) thì sẽ không chia hết cho 2 và 3, nên nó sẽ có dạng 6i + 1 hoặc 6i + 5 (6i ± 1). Nên trong 6 số thì chỉ cần xét 2 số này (bước nhảy 2, 4), tiết kiệm được 2/3 số bước phải chạy. Tương tự nếu xét luôn số 5 thì số bước phải chạy chỉ là 8/30 (30i ± (1, 7, 11, 13)).
Thông thường người ta chỉ xét tới (2, 3) thôi, không cần phải sử dụng thêm 1 mảng để lưu trữ các bước nhảy. Như trường hợp xét tới số 5 thì bước nhảy là (2, 4, 6, 2, 6, 4, 2, 4).