Đếm số nguyên tố trong mảng

Em mới học mảng 1 chiều, vòng lặp với cấu trúc rẽ nhánh, làm hoài mà kết quả ra sai vì bị trùng lập đếm số nguyên tố hoặc là tính số nguyên tố bị sai, mong các tiền bối chỉ lỗi sai hộ @@ em cảm ơn nhiều ạ!

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	int *a, n;
	cout << "Nhap 1 so duong: ";
	cin >> n;
	a = new int(n);
	
	for (int i = 0; i < n; i++){
		cout << "Nhap so thu " << i << ": ";
		cin >> a[i];
	}
	int dem = 0;
	bool laSNT = 0;
	for (int i = 0; i < 6; ){
		for (int j = 2; j <= sqrt(a[i]); j++){
			if (a[i] % j == 0){
				laSNT = 0;
				
			}
			if (laSNT = 1)
				dem++;
				cout << a[i] << " ";				
			}
		i++;
		laSNT = 0;	
		}
	cout << "So nguyen to xuat hien: " << dem;
	}
		if (laSNT = 1)

có ý nghĩa là gì ?
for (int i = 0; i < 6; ) <= tại sao i < 6 ?
Bạn giải thích về code và ý tưởng bạn xem nào . Mong phản hồi sớm từ bạn

1 Like

bài này mình có vẽ lưu đồ, đại khái như vầy: dựa trên điều kiện là a[i] % j == 0

  • Nếu True thì i++ sau đó lại xét điều kiện.
  • Nếu false thì j++ xét trong khoảng [2; căn bậc 2 của a[n] ):
    + Nếu lại false thì kết luận a[i] ngay lúc đó là số nguyên tố, biến đếm tăng 1 sau đó lại cho i++ rồi tiếp tục xét điều kiện.
    + Còn nếu true thì cho i++ sau đó xét tiếp điều kiện a[i] % j == 0 và tiếp tục vòng lặp.

Vậy bạn cho mình biết định nghĩa về số nguyên tố là số như thế nào ?

là số không có ước số từ 2 đến căn bậc 2 số đó

Số nguyên tốsố tự nhiên lớn hơn 1 không phải là tích của hai số tự nhiên nhỏ hơn. Nói cách khác, số nguyên tố là những số chỉ có đúng hai ước số là 1 và chính nó.

Không có số chẵn {\displaystyle n}n lớn hơn 2 nào là số nguyên tố vì một số chẵn bất kỳ có thể được biểu diễn thành {\displaystyle 2\times n/2}{\displaystyle 2\times n/2}. Do đó, tất cả số nguyên tố ngoài số 2 là số lẻ và được gọi là số nguyên tố lẻ .[8]

Qua đoạn này , bạn sẽ xác định được, 2 điều kiện là 1 số nguyên tố khi:

  1. n > 1
  2. a[i] % j == 0(như code của bạn)
		if (laSNT = 1)

Đoạn code này của bạn đã thiếu dấu = trong phép so sánh

if (a[i] % j == 0){
				laSNT = 0;
				
			}
			if (laSNT = 1)
				dem++;
				cout << a[i] << " ";				
			}

Với đoạn này tại sao bạn không gộp lại luôn mà lại tách ra ??

if (a[i] % j == 0){
// khi a[i] là số nguyên tố
				dem++;
				cout << a[i] << " ";
			}

Bạn sẽ bỏ luôn biến laSNT

1 Like

cái này là hàm bool mà bạn @@ “1” là “true” mà, sao lại dùng dấu "== " được :thinking: :face_with_raised_eyebrow:

int dem = 0;
	bool laSNT = false;
	for (int i = 0; i < 6; ){
		for (int j = 2; j <= sqrt(a[i]); j++){
			if (a[i] % j == 0){
				laSNT = false;
				break;
			}
			if (laSNT = true)
				dem++;
				cout << a[i] << " ";				
			}
		i++;
		laSNT = 0;	
		}
	cout << "So nguyen to xuat hien: " << dem;

căn bản là nếu thay 0 và 1 thành true, false nó sẽ giống như trên, đây đâu phải phép so sánh @@ hàm boolean mà @@

cho mình hỏi tí, vậy bạn hiểu = và == khác nhau như thế nào không ,
tại sao bạn lại gọi boolean là hàm
Vì trong đoạn code của bạn, chỉ có lúc khởi tạo laSNT và lúc gán laSNT = 0 , mình không hề thấy việc gán laSNT = 1 khi nào hết

1 Like
for (int j = 2; j <= sqrt(a[i]); j++){
			if (a[i] % j == 0){
				laSNT = 0;
				
			}
			if (laSNT = 1)
				dem++;
				cout << a[i] << " ";			

có mà @@ trong đoạn code có đoạn mình gán “laSNT = 1” mà @@

với lại “=” là phép gán, còn “==” là phép so sánh

mình chỉ thấy đoạn if (laSNT = 1) thôi @@

mình gán “laSNT = 0” cho điều kiện a[i] % j == 0 nếu đk đúng, và dùng nếu điều kiện sai dưới dạng “laSNT = 1” để biểu đạt điều kiện trên sai @@ gán chi nữa

nhưng bạn khởi tạo bool laSNT = 0; mà @@ chẳng phải lúc nào laSNT luôn luôn là 0 hay sao

1 Like

cái vụ boolean này mình cũng mơ hồ, nhưng dạng bài đếm số nguyên tố này trước khi học mảng cũng có làm mấy lần, ví dụ như đoạn code dưới đây theo đề bài yêu cầu là xuất ra n số nguyên tố đầu tiên:

#include<iostream>
using namespace std;

int main(){
	int n;
	do {
		cout << "Nhap 1 so nguyen duong: ";
		cin >> n;
	} while (n <= 0);
	
	int dem = 0;
	int x = 2;
	while (dem < n){
		bool laSNT = true;
		for (int i = 2; i <= x - 1; i++){
			if (x % i == 0){
				laSNT = false;
				break;
			}
		}
		if (laSNT = true){
			cout << x << " ";
			dem++;
		}
		x++;		
	}
}

mình chưa hoàn toàn hiểu lắm nhưng căn bản đoạn code này đúng 100% nên mình áp dụng nó vào bài của mảng @@ chẳng qua bị vướng chỗ từ index này của mảng chuyển sang index khác làm lặp lại số của biến đếm với đk có vấn đề sao sao ấy @@ chạy toàn ra kết quả sai

	bool laSNT = true;

ở code này , bạn gán true này
trong khi đoạn code kia bạn lại gán là 0 (false)

mình có đọc mấy bài viết trên đây có nói là lúc khai báo biến bool thì muốn true false tùy ý, nên cái đó k vấn đề đâu, yên tâm, k tin bạn chép đoạn code đó vào compiler xong đổi trên bool laSNT = false thì nó vẫn chạy như thường

if (laSNT = 1)
				dem++;
				cout << a[i] << " ";				
			}

bạn thiếu dấu “{” kìa

1 Like

Chép đi đâu vậy?


Bạn nên xoá hẳn code đi và code lại. Ở đây cần viết hàm kiểm tra nguyên tố riêng.

3 Likes

không, cái vụ này đang nói cái boolean thôi ấy, 2 đoạn code khác nhau của 2 đề bài khác nhau mà, @noname00

Logic của bài này của bạn thực sự có vấn đề.

2 Likes

đúng rồi, mình cũng thấy cực kì lọng cọng @@ nhưng k biết vấn đề xảy ra đoạn code nào, bây giờ nó cứ xét điều kiện xong cứ không chia hết thì lại đếm 1 lần, xong cho tới hết giá trị j xong đổi 1 giá trị i khác rồi lại lặp lại @@

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