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