Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में रेंज में उन संख्याओं की गिनती जिनके अभाज्य गुणनखंडों की घातों का GCD 1 है


दो संख्याएं start और end दी गई हैं जो धनात्मक पूर्णांकों की एक रेंज दर्शाती हैं। लक्ष्य उन सभी संख्याओं की गिनती ढूंढना है जो रेंज [start,end] में हैं और जिनका अभाज्य गुणनखंड ऐसा है कि उस संख्या के सभी अभाज्य गुणनखंडों की घातें ऐसी हैं कि उनका GCD 1 है।

यदि किसी संख्या का अभाज्य गुणनखंड 2p * 3q * 5r ….. है। तो घातें p,q,r ...का gcd=1 होना चाहिए।

उदाहरणों से समझते हैं।

उदाहरण के लिए

इनपुट - start = 1, end = 10 

आउटपुट - रेंज में उन संख्याओं की गिनती जिनके अभाज्य गुणनखंडों की घातों का GCD 1 है: 6

व्याख्या - संख्याएं हैं:

2 ( 21 ), 3 ( 31 ), 5 ( 51 ), 7 ( 71 ), 8 ( 23 ) और 10 ( 21*51 )। प्रत्येक अभाज्य गुणनखंड की सभी घातों का gcd 1 है।

इनपुट - start = 11, end = 20 

आउटपुट - रेंज में उन संख्याओं की गिनती जिनके अभाज्य गुणनखंडों की घातों का GCD 1 है: 9

व्याख्या - संख्याएं हैं:

11 ( 111 ), 12 ( 31*22 ), 13 ( 131 ), 14 ( 21*71 ), 15 ( 31*51 ), 17 ( 171 ), 18 ( 21*32 ), 19 ( 191 ) और 20 ( 22*51 )। प्रत्येक अभाज्य गुणनखंड की सभी घातों का gcd 1 है।

नीचे दिए गए प्रोग्राम में उपयोग किया गया दृष्टिकोण

इस दृष्टिकोण में हम रेंज start से end तक उन सभी संख्याओं को गिनेंगे जो पूर्ण घात नहीं हैं। क्योंकि गैर-पूर्ण घात उपरोक्त शर्त को पूरा करेंगे। इसके लिए हम सभी पूर्ण घातें ढूंढेंगे और उन्हें कुल गिनती से हटा देंगे। 

उत्तर होगा = start-end +1 - ( रेंज[start,end] में उन संख्याओं की गिनती जो पूर्ण घात हैं )।

  • रेंज वेरिएबल start और end को इनपुट के रूप में लें।
  • घात 3 से बड़ी संग्रहीत करने के लिए वेक्टर vec लें।
  • पूर्ण वर्ग वाली संख्याओं को संग्रहीत करने के लिए सेट sett लें।
  • गैर-पूर्ण वर्ग वाली संख्याओं को संग्रहीत करने के लिए सेट sett_2 लें।
  • फ़ंक्शन calculate() वेक्टर vec और सेट sett और sett_2 को भरता है। पूर्ण वर्ग, गैर-पूर्ण वर्ग और घात>3 वाली संख्याओं को अलग करने के लिए।
  • i=2 से i<size तक for लूप का उपयोग करके पार करें।
  • sett में पूर्ण घात i*i डालें।
  • IF sett.find(i) != sett.end()) true लौटाता है तो i एक पूर्ण वर्ग है और sett में मौजूद है तो कुछ न करें।
  • वर्तमान संख्या की घात बड़ी से कम रहने तक while लूप चलाएं।
  • विषम घातों को sett_2 में डालें क्योंकि सम घात पूर्ण वर्ग हैं और sett में हैं।
  • अंत में for लूप का उपयोग करके sett_2 के क्रमबद्ध मानों को वेक्टर vec में डालें।
  • फ़ंक्शन GCD_1(long int start, long int end) रेंज को इनपुट के रूप में लेता है और रेंज में उन संख्याओं की गिनती लौटाता है जिनके अभाज्य गुणनखंडों की घातों का GCD 1 है।
  • calculate() कॉल करें।
  • रेंज में पूर्ण वर्गों की गणना करें per_sq = floor(sqrtl(end)) - floor(sqrtl(start - 1)) के रूप में।
  • upper_bound(vec.begin(), vec.end(), end) - vec.begin() का उपयोग करके vec में start का ऊपरी मान गणना करें।
  • इसी तरह lower_bound(vec.begin(), vec.end(), start) - vec.begin() का उपयोग करके vec में end का निचला मान गणना करें।
  • पूर्ण घातों की गणना करें per_pow = per_sq + (top - bottom) के रूप में।
  • उत्तर होगा count = (end - start + 1) - per_pow।
  • अंत में परिणाम के रूप में count लौटाएं।

उदाहरण

#include <bits/stdc++.h> using namespace std; #define size 1000005 #define large 1e18 vector < long int > vec; set < long int > sett; set < long int > sett_2; void calculate() {    for (long int i = 2; i < size; i++) {       sett.insert(i * i);       if (sett.find(i) != sett.end()) {          continue;       }       long int total = i;       while (i * i <= large / total) {          total *= (i * i);          sett_2.insert(total);       }    }    for (auto it: sett_2) {       vec.push_back(it);    } } long int GCD_1(long int start, long int end) {    calculate();    long int per_sq = floor(sqrtl(end)) - floor(sqrtl(start - 1));    long int top = upper_bound(vec.begin(), vec.end(), end) - vec.begin();    long int bottom = lower_bound(vec.begin(), vec.end(), start) - vec.begin();    long int per_pow = per_sq + (top - bottom);    long int count = (end - start + 1) - per_pow;    return count; } int main() {    long int start = 10, end = 40;    cout << "Count of numbers in a range having GCD of powers of prime factors equal to 1 are: " << GCD_1(start, end);    return 0; }

यदि हम उपरोक्त कोड चलाते हैं तो यह निम्नलिखित आउटपुट उत्पन्न करेगा -

आउटपुट

Count of numbers in a range having GCD of powers of prime factors equal to 1 are: 7

  1. - C++ में दी गई रेंज में फैक्टोरियल संख्याओं की गिनती करें

    हमें एक रेंज दी गई है जो एक पूर्णांक मान से शुरू होती है जिसे चर द्वारा धारित किया जाता है, मान लीजिए प्रारंभ से चर अंत तक और कार्य दी गई रेंज में उपलब्ध फैक्टोरियल संख्याओं की कुल संख्या को गिनना है। फैक्टोरियल संख्या क्या है एक संख्या का फैक्टोरियल एक संख्या में अंकों को गुणा करके घटते क्रम में

  1. - C++ में सभी अभाज्य गुणनखंड और उनकी घातें प्रिंट करें

    इस समस्या में, हमें एक संख्या N दी गई है, और हमें उन सभी अद्वितीय अभाज्य गुणनखंडों और उनकी घातों को ढूंढना है जो उस संख्या को विभाजित करते हैं। विषय को समझने के लिए एक उदाहरण लेते हैं - इनपुट: 55 आउटपुट: 5 घात 1, 11 घात 1 व्याख्या - 55, 5 और 11 से विभाज्य है। इस समस्या को हल करने का एक आसान तरीका N

  1. - 1 से N तक ऑलमोस्ट अभाज्य संख्याओं की गिनती खोजें C++ में

    मान लीजिए हमारे पास एक संख्या N है। हमें 1 से N की रेंज में ऑलमोस्ट अभाज्य संख्याएं खोजनी हैं। एक संख्या को ऑलमोस्ट अभाज्य कहा जाता है जब उसके ठीक दो अलग-अलग अभाज्य गुणनखंड हों। संख्याओं में कितने भी गैर-अभाज्य गुणनखंड हो सकते हैं, लेकिन दो अभाज्य गुणनखंड होने चाहिए। तो यदि N 21 है, तो आउटपुट 8 होगा