01/10/2018, 15:55

Bài toán liệt kê số nguyên tố nhỏ hơn n trong c

chào mọi người hiện tại em đang làm bài toán liệt kê số nguyên tố nhỏ hơn n (n nhập từ bàn phím ), em hiện tại đã code xong nhưng không rõ sai đâu mà lúc chạy nó hiện kết quả như hình dưới. Mong mọi người giải đáp em cảm ơn

Hà Hải Nam viết 18:06 ngày 01/10/2018

Up code lên để mình sửa cho.

Trần Mạnh Quân viết 18:05 ngày 01/10/2018

Code bên trên bạn ơi

phamvandung viết 18:00 ngày 01/10/2018

Không có ai rảnh ngồi gõ lại đoạn code kia đâu, bạn paste code lên, vào

` ` `
giữa 3 dấu huyền viết liền (cạnh số 1) như này
` ` `
Trần Mạnh Quân viết 18:01 ngày 01/10/2018
#include <stdio.h>
int nguyento(int n)
{	
	int i;
	for (i=2;i<=n;i++)
			if (n%i==0)
				{
					return 1;
					break;
				}
}
int main(void)
{
	int i,n,kt;
	printf("Nhap vao so nguyen n: ");
	scanf("%d",&n);
	printf("\nCac so nguyen to nho hon n la: ");
	for (i=2;i<=n;i++)
		if(nguyento(i)==1) printf ("%d ",i);
	return 0;	
}
Evil Artist viết 18:09 ngày 01/10/2018

Bài này mắc lỗi sai cực kỳ nghiêm trọng ở hàm

int nguyento(int n)

còn lại tự debug và sửa lỗi nhé.

Trần Mạnh Quân viết 18:08 ngày 01/10/2018

đại khái sau khi fix thì vẫn không chạy được ạ

int nguyento(int n)
{	
	int i;
	for (i=2;i<=n;i++)
			if (n%i==0)
				{
					return 0;
					break;
				}
	return 1;
}
Aster-Dynos viết 18:09 ngày 01/10/2018

Vấn đề ở đây là algorithm của bạn sai hoàn toàn rồi (bạn nên check lại logic của bạn trên giấy trước khi viết nó trên máy tính nha)

Hint: bạn muốn kiếm all prime numbers < n thì công thức toán Sieve of Eratosthenes là điểm khởi đầu tốt cho bạn đấy.

Good luck.

Trần Mạnh Quân viết 17:56 ngày 01/10/2018

đại khái mình vẫn chưa rõ giải thuật sai ở đâu, đại khái là mình kiểm tra 1 số n có phải là số nguyên tố không, thì cho i chạy từ 2 đến n, nếu n chia hết cho i thì trả về giá trị 0 ( tức là không phải số nguyên tố), nếu không phải thì trả về giá trị 1. Và nếu hàm trả về giá trị 1 thì in i ra màn hình

Evil Artist viết 17:59 ngày 01/10/2018

Hãy test làm nguyento trước với 1 số nguyên tố (vd 5) và 1 số không nguyên tố (vd 4).
Trong câu

if(n%i==0) 

In ra màn hình

"%d chia het cho %d", n, i

Kiểm tra kết quả để biết sai ở đâu

Trần Mạnh Quân viết 17:59 ngày 01/10/2018

à rồi cảm ơn bác, tại xét <=n trong vòng lặp for của hàm nên ra kết quả sai

Hà Hải Nam viết 18:11 ngày 01/10/2018

Đã sửa lại cho bạn nè, đã tối ưu hóa thuật toán để không phải lặp nhiều.

#include <stdio.h>
#include <math.h>
int nguyento(int n)
{
    int i;
    for (i = 2; i <= (int)sqrt(n); i++)
        if (n % i == 0 and n != i)
        {
            return 1;
            break;
        }
}
int main(void)
{
    int i, n, kt;
    printf("Nhap vao so nguyen n: ");
    scanf("%d", &n);
    printf("\nCac so nguyen to nho hon n la: ");
    for (i = 2; i <= n; i++)
        if (nguyento(i) != 1)
            printf("%d ", i);
    return 0;
}
Nguyễn Phú Thành viết 18:06 ngày 01/10/2018

người ta nhập vào số <2 thì sao ? tối ưu code là việc làm sau cùng trước hết là phải tìm hết các trường hợp có thể xảy ra cái đã

Trần Mạnh Quân viết 18:04 ngày 01/10/2018

cảm ơn bác, với cả mình cũng đã sửa lại bài để tính các trường hợp < 2 rồi

Hà Hải Nam viết 18:06 ngày 01/10/2018

Cảm ơn bác đã nhắc nhở. <3

Bài liên quan
0