इक्विडिजिटल नंबर गणितीय रूप से विशेष संख्याएं हैं जिनमें संख्या में अंकों की संख्या इसके अभाज्य गुणनखंड में अंकों की संख्या के बराबर होती है।
इस समस्या में, हमें एक पूर्णांक मान n दिया गया है। हमारा कार्य n तक के सभी इक्विडिजिटल नंबरों को प्रिंट करने के लिए एक प्रोग्राम बनाना है।
उदाहरण से समझते हैं:
इनपुट: n = 12
आउटपुट: 1 2 3 5 7 10 11
समाधान दृष्टिकोण:
समस्या का एक सरल समाधान संख्या के गुणनखंड ढूंढकर और जांचना होगा कि क्या अभाज्य संख्याओं की संख्या संख्या में अंकों की संख्या के बराबर है।
अभाज्य गुणनखंड छलनी विधि (sieve method) का उपयोग करके पाए जा सकते हैं।
एल्गोरिदम:
चरण 1: सभी अभाज्य संख्याएं ढूंढें।
चरण 2: संख्या n में अंकों की गिनती करें।
चरण 3: संख्या के सभी अभाज्य गुणनखंड ढूंढें और उनमें अंकों की गिनती करें।
चरण 4: दोनों मानों की तुलना करें।
चरण 5: यदि सत्य हो तो संख्या वापस करें।
हमारे समाधान की कार्यप्रणाली को दर्शाने वाला प्रोग्राम:
उदाहरण
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000;
vector<int> primes;
void findAllPrimes() {
bool marked[MAX/2 + 1] = {0};
for (int i = 1; i*i <= (MAX - 1)/2; i++)
for (int j = (i*(i+1)) << 1; j <= MAX/2; j = j + 2*i + 1)
marked[j] = true;
primes.push_back(2);
for (int i = 1; i <= MAX/2; i++)
if (marked[i] == false)
primes.push_back(2*i + 1);
}
bool isEquidigital(int n) {
if (n == 1)
return true;
int number = n;
int digitSum = 0;
while (number > 0) {
digitSum++;
number = number / 10;
}
int primeDigits = 0, expCount = 0, p;
for (int i = 0; primes[i] <= n/2; i++) {
while (n % primes[i] == 0) {
p = primes[i];
n = n / p;
expCount++;
}
while (p > 0) {
primeDigits++;
p = p / 10;
}
while (expCount > 1) {
primeDigits++;
expCount = expCount / 10;
}
}
if (n != 1) {
while (n > 0) {
primeDigits++;
n = n / 10;
}
}
return (primeDigits == digitSum);
}
int main() {
findAllPrimes();
int n = 11;
cout << "Printing Equidigital Numbers less than " << n << " : ";
for (int i = 1; i < n; i++)
if (isEquidigital(i))
cout << i << "\t";
return 0;
}
आउटपुट:
Printing Equidigital Numbers less than 11 : 1 2 3 5 7 10 11