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

डीएफए आधारित डिवीजन


Deterministic Finite Automaton(DFA) का उपयोग यह जांचने के लिए किया जाता है कि कोई संख्या किसी अन्य संख्या k से विभाज्य है या नहीं। यदि यह विभाज्य नहीं है, तो यह एल्गोरिथम शेषफल भी खोज लेगा।

DFA बेस्ड डिवीजन के लिए सबसे पहले हमें DFA की ट्रांजिशन टेबल ढूंढनी होती है, उस टेबल का इस्तेमाल करके हम आसानी से जवाब ढूंढ सकते हैं। DFA में, प्रत्येक राज्य में केवल दो संक्रमण 0 और 1 होते हैं।

इनपुट और आउटपुट

Input:
The number: 50 and the divisor 3
Output:
50 is not divisible by 3 and remainder is: 2

एल्गोरिदम

dfaDivision(num, k)

इनपुट: एक संख्या संख्या, और भाजक k.

आउटपुट: विभाज्यता और शेष की जाँच करें।

Begin
   create transition table of size k * 2 //2 for transition 0 and 1
   state = 0
   checkState(num, state, table)
   return state
End

checkState(num, State, table)

इनपुट: एक संख्या संख्या, स्थिति और संक्रमण तालिका।

>आउटपुट: विभाजन करने के बाद राज्य को अपडेट करें।

Begin
   if num ≠ 0, then
      tempNum := right shift number for i bit
      checkState(tempNum, state, table)
      index := number AND 1 //perform logical and with number and 1
      state := table[state][index]
End

उदाहरण

#include <iostream>
using namespace std;

void makeTransTable(int n, int transTable[][2]) {
   int zeroTrans, oneTrans;

   for (int state=0; state<n; ++state) {
      zeroTrans = state<<1;   //next state for bit 0
      transTable[state][0] = (zeroTrans < n)? zeroTrans: zeroTrans-n;

      oneTrans = (state<<1) + 1;    //next state for bit 1
      transTable[state][1] = (oneTrans < n)? oneTrans: oneTrans-n;
   }
}

void checkState(int num, int &state, int Table[][2]) {
   if (num != 0) {    //shift number from right to left until 0
      checkState(num>>1, state, Table);
      state = Table[state][num&1];
   }
}

int isDivisible (int num, int k) {
   int table[k][2];    //create transition table
   makeTransTable(k, table);    //fill the table
   int state = 0;    //initially control in 0 state
   checkState(num, state, table);
   return state;    //final and initial state must be same
}

int main() {
   int num;
   int k;
   cout << "Enter Number, and Divisor: "; cin >> num>> k;
   int rem = isDivisible (num, k);
   if (rem == 0)
      cout<<num<<" is divisible by "<<k;
   else
      cout<<num<<" is not divisible by "<<k<<" and remainder is: " << rem;
}

आउटपुट

Enter Number, and Divisor: 50 3
50 is not divisible by 3 and remainder is: 2

  1. रिएक्ट नेटिव में राज्य क्या है?

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

  1. पत्राचार आधारित डेटा संरचनाएं

    टोटल और लीफ पत्राचार अधिक परिष्कृत पत्राचार तकनीक हैं। इन दोनों तकनीकों में, आधे तत्व न्यूनतम PQ में और अन्य आधे अधिकतम PQ में स्थित होते हैं। जब तत्वों की संख्या विषम होती है, तो एक तत्व बफर में संग्रहीत होता है। यह बफ़र किया गया तत्व या तो PQ का सदस्य नहीं है। कुल पत्राचार तकनीक में, न्यूनतम PQ मे

  1. पायथन में Collatz अनुक्रम

    मान लीजिए कि हमारे पास एक धनात्मक पूर्णांक n है, तो हमें इसके Collatz अनुक्रम की लंबाई ज्ञात करनी होगी। जैसा कि हम जानते हैं Collatz अनुक्रम क्रमिक रूप से उत्पन्न होता है जहाँ n =n/2 जब n और भी अन्यथा n =3n+ 1 होता है। और यह क्रम n =1. पर समाप्त होता है। इसलिए, यदि इनपुट n =13 जैसा है, तो आउटपुट 10