Code C !! Nhập n xuất ra n số nguyên tố đầu tiên trở đi.

Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!

PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui :cry:)

Cách 1: Em lập hàm bool isPrime(int x), nhận vào x, return true nếu x là ngtố, false nếu x ko là nguyên tố
xong


for (i = 2,soNguyenToDaXuat = 0;soNguyenToDaXuat < n;++i)
if (isPrime(x) == true)
{
++soNguyenToDaXuat; //nên đặt tên biến khác ngắn gọn hơn
//in i ra màn hình
}

Cách 2: Em lên mạng search wiki bài: sàng số nguyên tố, xong chuyển qua wiki tiếng anh, có tấm hình thuật toán mô phỏng :slight_smile: (cách này code nhiều hơn 1 chút, nhưng chạy nhanh hơn). Đây là gợi ý thôi, anh không tìm giúp cho đâu.

Cách của anh:
Dùng 1 mảng để chứa n số nguyên tố mà e nói:
1 số là số nguyên tố sẽ không chia hết cho các số nguyên tố bé hơn hoặc = căn bậc hai của nó.
Như vậy thì mảng đầu của ta là 2, số tiếp theo là 3 vì 3 ko chia hết cho 2, số tiếp là 5 vì không chia hết cho 2, số tiếp là 7 vì không chia hết cho 2, số tiếp là 11 vì không chia hết cho 2 và 3. Cứ z thôi ;))

Code C

Đây là code đầy đủ tự tối ưu code lại nhé…

#include <stdio.h>
#include <conio.h>

int Ngto(int n)
{
	int i;
	for(i=2;i<n;i++)
	{
		if(n%i==0)
		{
			break;
		}
	}
	if(i==n)
		return 1;
	return 0;
}

void main()
{
	int n;
	printf("
 n = ");scanf("%d",&n);
	int dem = n;
	for(int i=2;i<100;i++)
	{
		if(Ngto(i))
		{
			printf("%4d",i);
			dem--;
		}
		if(dem==0)
			break;
	}
	getch();
}

[QUOTE=12520333;170949]Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!

PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui :cry:)[/QUOTE]

Xem thử dc chưa nhé.


#include <stdio.h>
#include <math.h>

int ktSNT (int n)
{
    if (n<2) return 0;
    for (int i=2,temp=int(sqrt(double(n))); i<=temp; i++)
        if (n%i==0) return 0;
    return 1;
}
int main (int N)
{
    printf("N= ");
    scanf("%d", &N);
    for(int i= 2, c = 0; c < N; i++)
    {
        if(ktSNT(i) == 1)
        {
            printf("N[%d]= %d   ", c, i);
            c++;
        }
    }
    return 0;
}

[QUOTE=12520333;170949]Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!

PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui :cry:)[/QUOTE]

Em có thể tham khảo bài này nhé. Trước tiên muốn in ra n số nguyên tố đầu tiên thì em cần có hàm kiểm tra số i có phải là 1 số NT hay không. Nếu là 1 số NT thì sẽ in ra và tăng giá trị biến đếm count_SNT lên 1 đơn vị. Nếu count_SNT bằng với số N thì nghĩa là đã in đủ N số NT đầu tiên, khi đó ta sẽ break ra khỏi vòng lặp và kết thúc chương trình.


#include "stdio.h"

bool SNT(int x)
{
	int i;

	if (x <= 1)
		return false;

	for (i = 2; i <= x/2; ++i)
		if (x % i == 0)
			return false;
	
	return true;
}

int main()
{
	int n, count_SNT;
	int i;

	do
	{
		printf("
Nhap vao so N (N > 0): N = ");
		scanf("%d", &n);
	} while (n <= 0);

	i = 2;
	count_SNT = 0;

	while (true)
	{
		if (SNT(i))
		{
			printf("%d ", i);	
			++count_SNT;
		}

		++i;

		if (count_SNT == n)
			break;
	}
	
	return 0;
}


t cũng làm y như Quý, khác 1 chỗ là while(count_SNT<n) :D, khỏi phải break, mệt :smiley:

[QUOTE=10520303;170982]Đây là code đầy đủ tự tối ưu code lại nhé…

#include <stdio.h>
#include <conio.h>

int Ngto(int n)
{
	int i;
	for(i=2;i<n;i++)
	{
		if(n%i==0)
		{
			break;
		}
	}
	if(i==n)
		return 1;
	return 0;
}

void main()
{
	int n;
	printf("
 n = ");scanf("%d",&n);
	int dem = n;
	for(int i=2;i<100;i++)
	{
		if(Ngto(i))
		{
			printf("%4d",i);
			dem--;
		}
		if(dem==0)
			break;
	}
	getch();
}

[/QUOTE]

Cảm ơn mấy anh đã trợ giúp: bài này khá dễ hiểu dành cho gà như em đc và code của anh Thành Trung thì ngắn nhưng khó hỉu đoi chút (đang mò…)

[QUOTE=11520086;170995]t cũng làm y như Quý, khác 1 chỗ là while(count_SNT<n) :D, khỏi phải break, mệt :D[/QUOTE]
Mình làm cho người khác hiểu nữa mà, làm cho rõ nghĩa. Cách của Duyệt xa xỉ quá :smiley:

[QUOTE=12520333;171015]…code của anh Thành Trung thì ngắn nhưng khó hỉu đoi chút (đang mò…)[/QUOTE] =)) gộp nên khó hiểu đó. code mấy sư huynh sử tỉ kia là ghi rời ra.:dreaming: code a.thành là i là số chạy kiểm tra số đó phải ko(SNT)! còn c là biến đếm

[QUOTE=10520303;170982]Đây là code đầy đủ tự tối ưu code lại nhé…

#include <stdio.h>
#include <conio.h>

int Ngto(int n)
{
	int i;
	for(i=2;i<n;i++)
	{
		if(n%i==0)
		{
			break;
		}
	}
	if(i==n)
		return 1;
	return 0;
}

void main()
{
	int n;
	printf("
 n = ");scanf("%d",&n);
	int dem = n;
	for(int i=2;i<100;i++)
	{
		if(Ngto(i))
		{
			printf("%4d",i);
			dem--;
		}
		if(dem==0)
			break;
	}
	getch();
}

[/QUOTE]

cho em hỏi cái chỗ return 1 và return 0 nó là như thế nào, em chưa hiểu rõ về return lắm… may anh giai thich dùm em với ( hình như return 1 là khi lệnh đúng phải ko ạ) Thank !!

:unhappy:

#include "iostream"
using namespace std;

int checknt(int x)
{
	int k=0;
	if(x<2) return 0;
	else
		for(int i=2;i<=sqrtf(x);i++)
			if(x%i==0)
				k++;
	if(k==0)
		return 1;
	return 0;
}

void main()
{
	int n,a=0;
	cout<<"Nhap n: ";cin>>n;
	for(int i=2;a<n;++i)
		if(checknt(i)==1)
			{
				a++;//điều kiện dừng
				cout<<i<<" ";
		}
	system("pause");
}

Trong 1 điều kiện if thì:

if(xzy)
		return 1;
	return 0;

đồng nghĩa vs

if(xyz)
		return 1;
	else
		return 0;

viết như vậy khỏi phải viết lại else…

còn return là để trả về giá trị đúng kiểu trả về (int checknt() sẽ trả về kiểu int - bắt buộc phải return ).
có hàm ko có kiểu trả về, ngược lại sẽ bắt buộc trả về…

return 0; trả về giá trị false
return 1; trả về giá trị true…

#include "iostream"
using namespace std;

int checknt(int x)
{
	int k=0;
	if(x<2) return 0;
	else
		for(int i=2;i<=sqrtf(x);i++)
			if(x%i==0)
				k++;
	if(k==0)
		return 1;
	return 0;
}

void main()
{
	int n,a=0;
	cout<<"Nhap n: ";cin>>n;
	for(int i=2;a<n;++i)
		if(checknt(i)==1)
			{
				a++;//điều kiện dừng
				cout<<i<<" ";
		}
	system("pause");
}

[/QUOTE]

cái này C++ mà anh… đang học C nên nhìn hơi trừu tượng @@!

[QUOTE=11520009;171073]Trong 1 điều kiện if thì:

if(xzy)
		return 1;
	return 0;

đồng nghĩa vs

if(xyz)
		return 1;
	else
		return 0;

viết như vậy khỏi phải viết lại else…

còn return là để trả về giá trị đúng kiểu trả về (int checknt() sẽ trả về kiểu int - bắt buộc phải return ).
có hàm ko có kiểu trả về, ngược lại sẽ bắt buộc trả về…

return 0; trả về giá trị false
return 1; trả về giá trị true…[/QUOTE]

vậy là cái return 0; là của if(i==n) chứ ko phải của int nguyento(int n) hả anh ???

Bài này bữa có trên vòng loại cuộc thi thuật toán.

#include <stdio.h>
int main()
{
    long int n,i,j,k;
    n=500;// số số nguyên tố cần in (max 5 600k gì đó )
    long int m[n];
    for (i=3,k=0,m[0]=2;k<n;++i)
        for (j=0;;++j)
        {
            if (m[j]*m[j]>i)//số nguyên tố là số không chia hết cho snt < sqrt của nó.
            {
                m[++k]=i;
                printf("%10d",i);
                break;
            }
            if (i%m[j]==0) break;//số nguyên tố là số không chia hết cho snt < sqrt của nó.
        }
}

tham khảo cái này xem :smiley:

#include "conio.h"
#include "stdio.h"
int ktsnt(int n)
{
	if(n<2) return 0;
	for(int i=2; i<=n/2;i++)
	{
		if(n%i==0) return 0;
	}
	return 1;
}
void main()
{
	int n,k=0;
	printf("nhap n=");
	scanf("%d",&n);
	for (int i=2;k<n;i++)
	{
		if(ktsnt(i))
		{
			k++;
			printf("%d ",i);
		}
	}
	getch();
}

như nè dùng C free thì chạy OK nhưng dùng VS thì báo lỗi này
on6.cpp(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

#include<stdafx.h>
#include<stdio.h>
#include<conio.h>
int lsnt(int n)
{
int i=2;
if(n<2) return 0;
if(n==2) return 1;
for(;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
main()
{
int i,k=2,dem=0,n;
printf("nhap a   ");scanf("%d",&n);
while(dem<n)
{
if(lsnt(k))
{
printf("%d
",k);
dem++;
}
k++;
}
}

[QUOTE=12520037;171540]


#include<stdio.h>
#include<conio.h>
int lsnt(int n)
{
	;
	if(n<2) return 0;
	if(n==2) return 1;
	for(int i=2;(i*i)<=n;i++)
	if(n%i==0) return 0;
	return 1;
}

}

[/QUOTE]
bạn thử cái này xem

dạ cho em hởi nếu bài này dùng đệ quy thì làm như thế nào ?