इस समस्या में, हमें एक पूर्णांक N दिया जाता है। और हमें N से कम या उसके बराबर सभी अर्ध-अभाज्य संख्याओं को मुद्रित करना होता है।
इस समस्या को हल करने से पहले, आइए समझते हैं कि अर्ध-अभाज्य संख्या क्या है।
अर्ध-अभाज्य संख्या एक संख्या है जिसका मान दो भिन्न अभाज्य संख्याओं का गुणनफल होता है।
आइए एक उदाहरण लेते हैं,
21 =3*7 एक अर्ध अभाज्य संख्या है।
25 =5*5 अर्ध अभाज्य संख्या नहीं है।
अब, n से कम या उसके बराबर अर्ध अभाज्य संख्याओं का उदाहरण लेते हैं।
Input: N = 15 Output: 6 10 14 15
इस समस्या को हल करने के लिए, हमें प्रत्येक संख्या को N के बराबर से कम लेना होगा और जांचना होगा कि क्या इसके दो अलग-अलग अभाज्य गुणनखंड हैं।
युक्ति - हम अपना एल्गोरिथ्म 6 से भी शुरू कर सकते हैं क्योंकि सबसे छोटी अर्ध-अभाज्य संख्या 6 है।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
vector<int>generateSemiPrimeNumbers(int n){
int index[n + 1];
for (int i = 1; i <= n; i++)
index[i] = i;
int countDivision[n + 1];
for (int i = 0; i < n + 1; i++)
countDivision[i] = 2;
for (int i = 2; i <= n; i++) {
if (index[i] == i && countDivision[i] == 2) {
for (int j = 2 * i; j <= n; j += i) {
if (countDivision[j] > 0) {
index[j] = index[j] / i;
countDivision[j]--;
}
}
}
}
vector<int> semiPrime;
for (int i = 2; i <= n; i++) {
if (index[i] == 1 && countDivision[i] == 0) semiPrime.push_back(i);
}
return semiPrime;
}
int main(){
int n = 15;
cout<<"Semi-prime numbers less that or equal to "<<n<<"are :\n";
vector<int>semiPrime = generateSemiPrimeNumbers(n);
for (int i = 0; i < semiPrime.size(); i++)
cout<<semiPrime[i]<<"\t";
return 0;
} आउटपुट
15 से कम या उसके बराबर अर्ध-अभाज्य संख्याएँ हैं -
6 10 14 15