Kiểm tra số nguyên tố trong mảng

đây là code số nguyên tố của em mà sao nó không chạy

#include<iostream>
using namespace std;
#define Max 100

void nhapmang(int mang1chieu[Max], int &sopt){
	cout << "\nNhap so phan tu:";
	cin >> sopt;
	for (int i = 0; i < sopt; i++)
	{
		cout << "\nNhap so phan tu thu " << i << ": ";
		cin >> mang1chieu[i];
	}
}

void xuatmang(int mang1chieu[Max], int sopt){
	for (int i = 0; i < sopt; i++)
	{
		cout << "\nSo phan tu thu " << i << ": " << mang1chieu[i];
	}
}
void KTSN(int mang1chieu[Max], int sopt){
	int dem = 0;
	for (int i = 0; i < sopt; i++)
	{
		for (int n = 1; n < sopt; n++){
			if (mang1chieu[i] % n == 0)
				dem++; 
		}
			if (dem == 2)
				cout << mang1chieu[i] << "la so ngto";
		
	}	
	
}

void main(){
	int mang1chieu[Max], sopt;
	nhapmang(mang1chieu, sopt);
	xuatmang(mang1chieu, sopt);
	KTSN(mang1chieu, sopt);
	system("pause");
}
1 Like

Hàm quan trọng nhất là KTSN() bị sai.

  • for (int n = 1; n < sopt; n++) => for (int n = 1; n <= mang1chieu[i]; n++)
  • Biến dem đem vào trong vòng for thứ nhất để nó reset lại

Mình nghĩ bạn nên tách thành 2 hàm Kiểm tra số nguyên tố (1 số) và Kiểm tra số nguyên tố trong mảng. Như vậy sẽ dễ hiểu hơn, và tránh được sai xót

2 Likes

bool songto(int n){
if (n < 2) return false;
if ( n == 2) return true;
for (int i = 1; i < (n/2); ++i)
if (n % i == 0) return false;
return true;
}

void KTSN(int mang1chieu[Max], int sopt){
for (int i = 0; i < sopt; i++)
if (songto(mang1chieu[1])
cout << mang1chieu[i] << “la so ngto”;
}

ủa ở dòng 3 trong hàm KTSN hình như thiếu điều kiện của if mà.

em sửa lại thành thế này mà nó vẫn không chạy là sao ạ T.T

#include<iostream>
using namespace std;
#define Max 50
void nhap(int mang1chieu[Max],int &sopt){
	cout << "\nNhap so phan tu:";
	cin >> sopt;
	for (int i = 0; i < sopt; i++)
	{
		cout << "\nNhap phan tu thu " << i<<":";
		cin >> mang1chieu[i];
	}
}
int tong(int mang1chieu[Max],int sopt){
	int lonnhat=mang1chieu[0];
	lonnhat = mang1chieu[0];
	for (int i = 0; i<sopt; i++)
	{
		if (lonnhat<mang1chieu[i])
			lonnhat = mang1chieu[i];

	}
	return lonnhat;
}
bool KTSNT(int n){
	int dem = 0;
	if (n < 2)
		return false;
	for (int i = 1; i < n; i++)
	{
		if (n%i == 0)
			dem++;
	}
	if (dem == 2)
		return true;
	return false;
}

void kiemtraSNT(int mang1chieu[Max],int sopt){
	for (int i = 0; i < sopt; i++)
	{
		KTSNT(mang1chieu[i]);
		if (mang1chieu[i] == true)
			cout << mang1chieu[i]<<" la so nguyen to trong mang."<<endl;
	}
	if (KTSNT == false)
		cout << "\nKhong co so nguyen to trong mang:";
}
void main(){
	int mang1chieu[Max],n;
	nhap(mang1chieu,n);
	cout << "\nSo lon nhat trong mang la:" << tong(mang1chieu,n) << endl;
	kiemtraSNT(mang1chieu, n);
	system("pause");
}

Đầu tiên ở hàm “tong”, bạn viết 1 lúc 2 lệnh giống nhau chi cho dư thừa vậy???
int lonnhat=mang1chieu[0];(1)
lonnhat = mang1chieu[0];(2)

Nếu bạn đã viết số 1 rồi thì không cần viết cái số 2 làm gì nữa.

Thứ 2 ở hàm KTSNT nếu bạn muốn “dem == 2” để xét đk snt thì trong vòng for “i<=n” khi đó n%1 và n%n mới đúng, còn nếu “i<n” như bạn viết thì sẽ sai kết quả.

Thứ 3 ở hàm kiemtraSNT trong vòng for câu lệnh if. mang1chieu[i] là kiểu int, không thể so sánh với kiểu bool được.

KTSNT(mang1chieu[i]);
if (mang1chieu[i] == true)

viết như trên là sai, sửa:

    if(KTSNT(mang1chieu[i])) // Vì hàm KTSNT trả giá trị true false nên nếu true thì if(true) nó sẽ thực hiện câu lệnh luôn, không cần == true chi nữa.
         cout << ...........

trong KTSNT
for (int i = 1; i < n; i++)
{
if (n%i == 0)
dem++;
}
if (dem == 2)
return true;
k nên làm vậy. sẽ dài dòng. mình cho nó chạy thẳng từ 2 luôn. nó chia hết cho cái nào thì return false. như vậy sẽ nhanh hơn

Đã có nhiều bài nói về kiểm tra số nguyên tố :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?