Chương trình in các cặp số sinh đôi bị in thiếu

Các số nguyên tố sinh đôi (twin prime) là các số nguyên tố mà khoảng cách giữa chúng là 2. Hãy in tất cả cặp số sinh đôi nhỏ hơn một số nguyên dương cho trước (số nguyên dương này < 1000)

Em viết chương trình rồi nhưng nó lại chỉ in ra 1 cặp chứ không in ra hết số cặp cần tìm :((

#include <iostream>
using namespace std;
int main()
{
	int n; cin >> n;
	int x = 0, y = 0, k = 0, h = 0, g = 0;
	for (int i = 3; i <= n; i++)
	{
		for (int a = 1; a <= i; a++)
			if (i % a == 0) k++;
		if (k == 2)
		{
			x = i;
			y = i + 2;
			for (int b = 1; b <= y; b++)
				if (y % b == 0) h++;
			if (h == 2)
			{
				cout << x << ", " << y << endl;
				g++;
			}
		}
	}
	cout << "Tong: " << g << " cap so sinh doi < " << n;
	return 0;
}
k = 0; //  hêm dòng này trước dòng for
for (int a = 1; a <= i; a++) if (i % a == 0) k++;
...

h = 0; // thêm dòng này trước dòng for
for (int b = 1; b <= y; b++) if (y % b == 0) h++;

vì sau khi bạn kiểm tra một số nào đó xong, k với h đã không còn là 0 nữa rồi
nên khi bạn đếm số ước của một số khác (dùng h, k làm biến điếm) thì lúc này nó sẽ cộng tiếp chứ không đếm từ 0 nữa

để cho dễ nhìn hơn, bạn nên sửa một tí

#include <iostream>
using namespace std;

// hàm này nhập vào số nguyên i kiểu in
// trả về true nếu i là số nguyên tố, false nếu không phải số nguyên tố
// hàm này được viết lại bằng ý tưởng của bạn, nếu bạn có thời gian, bạn có thể tự cải thiện thêm
bool isPrime(int i) {
    int k = 0
    for (int a = 1; a <= i; a++) if (i % a == 0) k++; // đếm số ước của của i
    return k == 2; // trả về true khi số ước của i là 2
}

int main()
{
	int n; cin >> n;
	int x = 0, y = 0, k = 0, h = 0, g = 0;
	for (int i = 3; i <= n; i++)
	{
                // nếu i và i+2 đều là só nguyên tố
		if (isPrime(i) && isPrime(i + 2))
		{
			cout << i << ", " << (i+2) << endl;
			g++;
		}
	}
	cout << "Tong: " << g << " cap so sinh doi < " << n;
	return 0;
}
4 Likes

em xin cảm ơn nhiều ạ

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