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

C++ में DFA आधारित विभाजन?

नियतात्मक परिमित ऑटोमेटन (डीएफए) का उपयोग यह जांचने के लिए किया जाता है कि कोई संख्या किसी अन्य संख्या k से विभाज्य है या नहीं। एल्गोरिथम उपयोगी है क्योंकि यदि संख्या विभाज्य नहीं है तो यह शेष को भी ढूंढ सकती है।

DFA आधारित डिवीजन में हम k स्टेट्स के साथ DFA टेबल बनाते हैं। हम संख्या के द्विआधारी प्रतिनिधित्व पर विचार करते हैं इसलिए डीएफए में प्रत्येक राज्य में केवल 0 और 1 है।

createTransTable(int k, int transTable[][2]) फ़ंक्शन का उपयोग ट्रांसटेबल बनाने और उसमें राज्यों को संग्रहीत करने के लिए किया जाता है। यह संख्या k लेता है जिससे संख्या विभाज्य होती है और ट्रांसटेबल [] [2] जो 2 कॉलम वाला एक सरणी है। फिर हम दो वैरिएबल ट्रांस_0 घोषित करते हैं जो बिट 0 अगले स्टेट और ट्रांस_1 को स्टोर करता है जो बिट 1 अगले स्टेट को स्टोर करता है।

void createTransTable(int k, int transTable[][2]){
   int trans_0, trans_1;

लूप के अंदर तब तक चलता है जब तक कि राज्य k से कम न हो जाए। अगर trans_0 संख्या k से कम है तो transTable[state][0] बराबर trans_0 और k को trans_0 से घटाया जाता है।

Trans_1 के लिए यदि trans_1, k से कम है तो transTable[state][1] बराबर trans_1 है और k को trans_1 से घटाया जाता है।

for (int state = 0; state < k; state++){
   trans_0 = state << 1;
   transTable[state][0] = (trans_0 < k) ? trans_0 : trans_0 - k;
   trans_1 = (state << 1) + 1;
   transTable[state][1] = (trans_1 < k) ? trans_1 : trans_1 - k;
}

checkDivisible(int num, int &state, int transTable[][2]) फ़ंक्शन वह संख्या लेता है जिसे विभाजित किया जाना है, संदर्भ द्वारा राज्य चर और transTable[][2] सरणी। यह जांचता है कि क्या संख्या 0 के बराबर नहीं है, तो यह मूल रूप से बिटवाइज़ राइट शिफ्ट का उपयोग करके नंबर को बाएं से दाएं 1 से तब तक शिफ्ट करता है जब तक कि नंबर खुद को रिकर्सिव कॉल करके 0 नहीं हो जाता। दाईं ओर शिफ्ट करने से संख्या को 2 से विभाजित किया जाता है जब तक कि यह 0 न हो जाए। तब ट्रांसटेबल [स्टेट] [संख्या और 1] को स्टेट वेरिएबल के लिए असाइन किया जाता है।

void checkDivisible(int num, int &state, int transTable[][2]){
   if (num != 0){
      checkDivisible(num >> 1, state, transTable);
      state = transTable[state][num&1];
   }
}

विभाज्य (int num, int k) फ़ंक्शन लाभांश संख्या और लाभांश k लेता है। 2 कॉलम और k पंक्तियों की संख्या वाली ट्रांज़िशन टेबल ट्रांसटेबल [k] [2] घोषित की गई है। createTransTable(k, transTable) और checkDivisible(num, State, transTable) को कहा जाता है जो स्टेट वेरिएबल को संशोधित करते हैं। इसके बाद स्टेट वेरिएबल को वापस कर दिया जाता है जो हमारे शेष भाग को छोड़कर शेष को दर्शाता है।

int isDivisible (int num, int k){
   int transTable[k][2];
   createTransTable(k, transTable);
   int state = 0;
   checkDivisible(num, state, transTable);
   return state;
}

उदाहरण

आइए हम DFA आधारित प्रभाग के लिए निम्नलिखित कार्यान्वयन को देखें।

#include <bits/stdc++.h>
using namespace std;
void createTransTable(int k, int transTable[][2]){
   int trans_0, trans_1;
   for (int state = 0; state < k; state++){
      trans_0 = state << 1;
      transTable[state][0] = (trans_0 < k) ? trans_0 : trans_0 - k;
      trans_1 = (state << 1) + 1;
      transTable[state][1] = (trans_1 < k) ? trans_1 : trans_1 - k;
   }
}
void checkDivisible(int num, int &state, int transTable[][2]){
   if (num != 0){
      checkDivisible(num >> 1, state, transTable);
      state = transTable[state][num&1];
   }
}
int isDivisible (int num, int k){
   int transTable[k][2];
   createTransTable(k, transTable);
   int state = 0;
   checkDivisible(num, state, transTable);
   return state;
}
int main(){
   int num = 67;
   int k = 5;
   int remainder = isDivisible (num, k);
   if (remainder == 0)
      cout <<num<< " is divisible by "<<k;
   else
      cout <<num<< " is not divisible by "<<k<<" and lefts remainder "<<remainder;
   return 0;
}

आउटपुट

उपरोक्त कोड निम्न आउटपुट उत्पन्न करेगा।

67 is not divisible by 5 and lefts remainder 2

  1. C++ . में रेखा परावर्तन

    मान लीजिए कि हमारे पास 2D तल पर n बिंदु हैं, हमें यह जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से दर्शाती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो दी गई रेखा पर सभी बिंदुओं को प्रतिबिंबित करने के बाद मूल बिंदुओं का सेट वही होता है जो प्रतिबि

  1. C++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प