Liệt kê n số nguyên tố đầu tiên

#include<stdio.h>
#include<conio.h>
main()
{
int i,a,dem=0,demc=0,n,b,z;
printf("Nhap so n la:"); 
scanf("%d",&n);
printf("Nhap so a la:");
scanf("%d",&a); 
for(i=2;i<=a;i++)
{
dem=0;

for(b=1;b<=a;b++)

if(i%b==0)


dem++;

if(dem==2)
{
z=i;	

}
if(demc<=n)
{

printf("%d ",z);
} 
}
getch();
}

Mọi người xem mình bị lỗi gì ? kiến thức còn kém k biết sai chỗ nào. Khi mình chạy thì nó bị lỗi như sau: VD: n=4; a=10 KQ: 2 3 3 5 5 7 7 7 7 đáng nhẽ phải ra 2 3 5 7 chứ :))~ :))~

Code bạn chỗ này hơi rối, và mình không hiểu ý tưởng lắm:

if(dem==2)
{
z=i;	

}
if(demc<=n)
{

printf("%d ",z);
} 

Mình có sửa qua một chút, ý tưởng của bạn thì vẫn giữ nguyên không thay đổi, mình chỉ comment cho dễ hiểu:

#include<stdio.h>
#include<conio.h>
int main()
{
	int i, a, dem = 0, demc = 0, n, b, z; 
	printf( "Nhap so n la:" ); // n la so luong so nguyen to can lke
	scanf( "%d" , &n );
	printf( "Nhap so a la:" ); // [0, a] la tap so tu nhien chua n so nguyen to
	scanf( "%d", &a ); 
	for( i=2; i <= a; i++ )
	{
		dem = 0;
		for( b=1; b<=a; b++)
			if( i % b == 0)
				dem++;

		if( dem == 2 ) // neu i la so nguyen to 
		{
			printf( "%3d", i ); // in ra i
			demc++; // so luong so nguyen to tang len 1
		}
		
		if ( demc == n ) // neu da du n so nguyen to thi thoat vong lap
			break;
	}
	getch();
}

Nhưng cách này chưa tối ưu vì giá trị a nhập vào mình không biết là bao nhiêu để bao hàm n số nguyên tố đầu tiên cả, việc tối ưu dành lại cho bạn nhá :astonished:

ý mình là thế này khi mà giá trị dem==2 tức là đã chọn được 1 số nguyên tố mình cần lưu nó bằng 1 biến đếm khác ở đây là biến demc sau đó thì m cần những biến demc đó<n rồi in nó ra ý m là như thế mong các b chỉ giáo ^^ trình độ còn hơi kém keke

cám ơn b QuangduyT nhé b code dễ hiểu lắm m hiểu r kekek :v

1 Like
#include<iostream>
using namespace std;
	bool KTSNT(int n){
		if(n<=2) return false;
		else
			for(int i=2;i<=n;i++)
				if(n%i==0 && n%2==0) return false;
				return true;
	}
int main(){
	int a,n,dem=0,count=0;
	do{
		cout<<"nhap N và a: ";
		cin>>n>>a;
	}while(a<n);
	cout<<n<<" so nguyen to dau tien la: ";
		for(int j=2;j<=a;j++){
			if(KTSNT(j)){
				count+=1;
				}		
		}
		if(count>=n){
			for(int i=2;i<=a;i++){
					if(KTSNT(i)){
					dem=dem+1;
					cout<<i<<" ";
						if(dem==n)
							break;
					}		
				}	
		}else{
			cout<<" rong, dl nhap sai";	
		}
	
	return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?