Số Smart: số có ít nhất 3 ước số nguyên tố phân biệt.
Dãy: 30 (2·3·5), 42 (2·3·7), 60 (2²·3·5), 66 (2·3·11), 70 (2·5·7), 78 (2·3·13)...
Thuật toán
- Duyệt số từ 30 trở lên.
- Đếm số ước nguyên tố phân biệt.
- Khi đếm = N → trả về.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
bool isSmart(int n) {
int cnt = 0;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0 && isPrime(i)) {
cnt++;
if (cnt >= 3) return true;
}
}
return false;
}
int nthSmartNumber(int n) {
int count = 0;
for (int i = 30; ; i++)
if (isSmart(i) && ++count == n) return i;
return -1;
}
int main() {
cout << nthSmartNumber(25) << endl; // 174
return 0;
}
Kết quả
174
Tối ưu: Dùng sàng Eratosthenes tiền xử lý ước nguyên tố cho N lớn.