Mã của bạn đang không hoạt động đúng cách vì bạn đang kiểm tra các chữ số của số nhập vào nếu chúng là 2, 3, 5, hoặc 7. Tuy nhiên, chương trình của bạn chỉ đếm các chữ số này một lần duy nhất, mà không quan tâm đến mức độ lặp lại của chúng. Điều này có nghĩa là nếu bạn có nhiều lần xuất hiện của các chữ số này, chương trình sẽ đếm chúng là 1, thay vì số lần xuất hiện thực sự.
Để sửa lỗi này, bạn nên đếm số lần xuất hiện của các chữ số nguyên tố mỗi khi chúng xuất hiện trong số n. Bạn thử cách dưới đây xem nhé:
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
if (num <= 3) return true;
if (num % 2 == 0 || num % 3 == 0) return false;
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
unsigned char demNT(unsigned long n) {
unsigned char dem = 0;
while (n > 0) {
unsigned char temp = n % 10;
n /= 10;
if (isPrime(temp)) {
dem++;
}
}
return dem;
}
int main() {
unsigned long n;
cout << "Nhap so nguyen duong n:";
cin >> n;
cout << demNT(n);
return 0;
}
Trong mã này, tôi đã định nghĩa một hàm isPrime
để kiểm tra xem một số có phải là số nguyên tố không. Sau đó, tôi đã sửa hàm demNT
để đếm số lần xuất hiện của các chữ số nguyên tố bằng cách sử dụng hàm isPrime
.