Cho mảng arr[]. Nhiệm vụ: tính tích các số hợp số (composite numbers) trong mảng.
Số hợp số: số nguyên > 1 không phải số nguyên tố (có ước ngoài 1 và chính nó). Ví dụ: 4, 6, 8, 9, 10...
Lưu ý: 1 không phải số nguyên tố cũng không phải số hợp số.
Ví dụ 1
Input – arr[] = {1, 2, 4, 5, 6, 7}
Output – 24
Giải thích: Số hợp số: 4, 6. Tích = 24.
Ví dụ 2
Input – arr[] = {10, 2, 4, 5, 6, 11}
Output – 240
Giải thích: Số hợp số: 10, 4, 6. Tích = 240.
Thuật toán (Sieve)
- Tìm max_val trong mảng.
- Sàng Eratosthenes tìm số nguyên tố đến max_val.
- Số > 1 và không phải nguyên tố → hợp số.
- Nhân các số hợp số.
Ví dụ code
#include <bits/stdc++.h>
using namespace std;
long long productOfComposites(int arr[], int n) {
if (n == 0) return 0;
int max_val = *max_element(arr, arr + n);
vector<bool> isPrime(max_val + 1, true);
isPrime[0] = isPrime[1] = false;
for (int p = 2; p * p <= max_val; p++) {
if (isPrime[p]) {
for (int i = p * 2; i <= max_val; i += p) isPrime[i] = false;
}
}
long long prod = 1;
bool found = false;
for (int i = 0; i < n; i++) {
int x = arr[i];
if (x > 1 && !isPrime[x]) { // >1 và không phải nguyên tố = hợp số
prod *= x;
found = true;
}
}
return found ? prod : 0;
}
int main() {
int arr[] = {2, 4, 6, 8, 10};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Product of composites: " << productOfComposites(arr, n) << endl;
return 0;
}
Kết quả
Product of composites: 1920
Giải thích: Tất cả 4,6,8,10 là hợp số. 2 là nguyên tố. Tích = 4×6×8×10 = 1920.