NỘI DUNG
Bài toán – Số siêu nguyên tố (Dành cho học sinh THCS)
Số siêu nguyên tố là số nguyên tố mà khi bỏ một số tuỳ ý các chữ số bên phải của nó thì phần còn lại vẫn tạo thành một số nguyên tố.
Ví dụ 7331 là một số siêu nguyên tố có 4 chữ số vì 733, 73, 7 cũng là các số nguyên tố.
Nhiệm vụ của bạn là viết chương trình nhập dữ liệu vào là một số nguyên N (0< N <10) và đưa ra kết quả là một số siêu nguyên tố có N chữ số cùng số lượng của chúng.
Cài đặt bài toán số siêu nguyên tố với Python
def is_prime(n):
"""Kiểm tra n có phải là số nguyên tố hay không"""
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
def generate_super_primes(n, current, result):
"""Tìm số siêu nguyên tố với N chữ số"""
if n == 0:
# Kiểm tra nếu số hiện tại là số nguyên tố
if is_prime(current):
result.append(current)
else:
# Duyệt qua các chữ số từ 1 đến 9
for i in range(1, 10):
# Nối chữ số vào cuối số hiện tại
next_number = current * 10 + i
# Đệ quy để tìm các số siêu nguyên tố có N chữ số
generate_super_primes(n - 1, next_number, result)
def find_super_primes_with_n_digits(n):
"""Tìm số siêu nguyên tố với N chữ số"""
result = []
generate_super_primes(n, 0, result)
return result
# Nhập dữ liệu vào là số nguyên N
N = int(input("Nhập số nguyên N (0 < N < 10): "))
if N > 0 and N < 10:
super_primes = find_super_primes_with_n_digits(N)
print(f"Có {len(super_primes)} số siêu nguyên tố có {N} chữ số:")
print(super_primes)
else:
print("Số N không hợp lệ!")
Cài đặt bài toán số siêu nguyên tố với C++
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
// Hàm kiểm tra số nguyên tố
bool isPrime(int n) {
if (n <= 1)
return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}
// Hàm kiểm tra số siêu nguyên tố
bool isSuperPrime(int n, int original, int count) {
if (n <= 1)
return false;
if (!isPrime(n))
return false;
if (original != n && count == 0)
return true;
int digit = log10(n) + 1;
int newCount = count;
while (n > 0) {
newCount--;
n /= 10;
}
if (newCount > 0)
return false;
return isSuperPrime(original % int(pow(10, digit - 1)), original, count - 1);
}
// Hàm đệ quy để tìm số siêu nguyên tố
void findSuperPrime(int n, int original, int count) {
if (n <= 0)
return;
findSuperPrime(n - 1, original, count);
if (isSuperPrime(n, n, count))
cout << n << " ";
}
int main() {
int n;
cout << "Nhap vao so nguyen duong n (0 < n < 10): ";
cin >> n;
cout << "Cac so sieu nguyen to co " << n << " chu so la: ";
findSuperPrime(pow(10, n) - 1, pow(10, n) - 1, n - 1);
cout << endl;
return 0;
}
Sử dụng sàng nguyên tố giải bài toán trên với C++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// Hàm kiểm tra số nguyên tố
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
// Hàm kiểm tra số siêu nguyên tố
bool isSuperPrime(int n) {
if (!isPrime(n)) {
return false;
}
int len = to_string(n).length();
for (int i = 1; i < len; i++) {
int p = n / pow(10, i);
if (!isPrime(p)) {
return false;
}
}
return true;
}
// Hàm tìm các số siêu nguyên tố có N chữ số
vector<int> findSuperPrimes(int N) {
vector<int> superPrimes;
int start = pow(10, N - 1);
int end = pow(10, N);
for (int i = start; i < end; i++) {
if (isSuperPrime(i)) {
superPrimes.push_back(i);
}
}
return superPrimes;
}
// Hàm main
int main() {
int N;
cout << "Nhap vao so N: ";
cin >> N;
vector<int> superPrimes = findSuperPrimes(N);
cout << "Cac so sieu nguyen to co " << N << " chu so la: " << endl;
for (int i = 0; i < superPrimes.size(); i++) {
cout << superPrimes[i] << " ";
}
cout << endl;
return 0;
}
Sử dụng sàng nguyên tố giải bài toán trên với Python
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def is_super_prime(n):
if not is_prime(n):
return False
while n > 0:
n //= 10
if not is_prime(n):
return False
return True
def find_super_primes(n):
primes = []
sieve = [True] * (10 ** n)
sieve[0] = sieve[1] = False
for i in range(2, int(10 ** (n / 2)) + 1):
if sieve[i]:
for j in range(i * i, 10 ** n, i):
sieve[j] = False
for k in range(10 ** (n - 1), 10 ** n):
if sieve[k] and is_super_prime(k):
primes.append(k)
return primes
n = int(input("Enter the number of digits: "))
super_primes = find_super_primes(n)
print(f"There are {len(super_primes)} super primes with {n} digits:")
for prime in super_primes:
print(prime)
Đầu tiên, hàm is_prime
kiểm tra xem một số có phải là số nguyên tố hay không. Hàm is_super_prime
kiểm tra xem một số có phải là số siêu nguyên tố hay không bằng cách loại bỏ từng chữ số bên phải của số đó và kiểm tra xem phần còn lại có phải là số nguyên tố hay không. Hàm find_super_primes
sử dụng thuật toán sàng Eratosthenes để tìm các số nguyên tố và kiểm tra xem chúng có phải là số siêu nguyên tố hay không. Cuối cùng, trong hàm main, chúng ta nhập vào giá trị N, tìm các số siêu nguyên tố và in kết quả ra màn hình.