इक्विडिजिटल संख्याएँ गणितीय रूप से विशेष संख्याएँ होती हैं जिनमें संख्या में अंकों की संख्या उसके अभाज्य गुणनखंड में संख्या के बराबर होती है।
इस समस्या में, हमें एक पूर्णांक मान n दिया गया है। हमारा काम n तक के सभी सम-डिजिटल नंबरों के लिए एक प्रोग्राम बनाना है।
समस्या को समझने के लिए एक उदाहरण लेते हैं,
इनपुट: एन =12पी>
आउटपुट:1 2 3 5 7 10 11
समाधान दृष्टिकोण:
समस्या का एक सरल समाधान यह होगा कि संख्या के गुणनखंड ज्ञात करें और जांचें कि क्या अभाज्य संख्याओं की संख्या संख्या में अंकों की संख्या के बराबर है।
मुख्य गुणनखंडों को चलनी विधि का उपयोग करके पाया जा सकता है।
एल्गोरिदम:
चरण 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