Check if binary string multiple of 3 using DFA

15 Jun, 2022
Given a string of binary characters, check if it is multiple of 3 or not.Examples : 
Input :  1 0 1 0
Output : NO
Explanation : (1 0 1 0) is 10 and hence
not a multiple of 3

Input :  1 1 0 0
Output : YES
Explanation : (1 1 0 0) is 12 and hence 
a multiple of 3
Approach 1 : One simple method is to convert the binary number into its decimal representation and then check if it is a multiple of 3 or not. Now, when it comes to DFA (Deterministic Finite Automata), there is no concept of memory i.e. you cannot store the string when it is provided, so the above method would not be applicable. In simple terms, a DFA takes a string as input and process it. If it reaches final state, it is accepted, else rejected. As you cannot store the string, so input is taken character by character.
The DFA for given problem is : 
As, when a number is divided by 3, there are only 3 possibilities. The remainder can be either 0, 1 or 2. Here, state 0 represents that the remainder when the number is divided by 3 is 0. State 1 represents that the remainder when the number is divided by 3 is 1 and similarly state 2 represents that the remainder when the number is divided by 3 is 2. So if a string reaches state 0 in the end, it is accepted otherwise rejected.
Below is the implementation of above approach : 
C++
Java
Python3
C#
PHP
Javascript
// C++ Program to illustrate// DFA for multiple of 3#include <bits/stdc++.h>using namespace std; // checks if binary characters// are multiple of 3bool isMultiple3(char c[], int size){    // initial state is 0th    char state = '0';     for (int i = 0; i < size; i++) {         // storing binary digit        char digit = c[i];         switch (state) {         // when state is 0        case '0':            if (digit == '1')                state = '1';            break;         // when state is 1        case '1':            if (digit == '0')                state = '2';            else                state = '0';            break;         // when state is 2        case '2':            if (digit == '0')                state = '1';            break;        }    }     // if final state is 0th state    if (state == '0')        return true;    return false;} // Driver's Codeint main(){    // size of binary array    int size = 5;     // array of binary numbers    // Here it is 21 in decimal    char c[] = { '1', '0', '1', '0', '1' };     // if binary numbers are a multiple of 3    if (isMultiple3(c, size))        cout << "YES\n";    else        cout << "NO\n";     return 0;}
// Java Program to illustrate// DFA for multiple of 3import java.io.*; class GFG{    // checks if binary characters    // are multiple of 3    static boolean isMultiple3(char c[], int size)    {        // initial state is 0th        char state = '0';             for (int i = 0; i < size; i++) {                 // storing binary digit            char digit = c[i];                 switch (state) {                 // when state is 0            case '0':                if (digit == '1')                    state = '1';                break;                 // when state is 1            case '1':                if (digit == '0')                    state = '2';                else                    state = '0';                break;                 // when state is 2            case '2':                if (digit == '0')                    state = '1';                break;            }        }             // if final state is 0th state        if (state == '0')            return true;        return false;    }            // Driver Code    public static void main (String[] args)    {        // size of binary array        int size = 5;             // array of binary numbers        // Here it is 21 in decimal        char c[] = { '1', '0', '1', '0', '1' };             // if binary numbers are a multiple of 3        if (isMultiple3(c, size))            System.out.println ("YES");        else            System.out.println ("NO");                 }}// This code is contributed by vt_m
# Python program to check if the binary String is divisible# by 3.    # Function to check if the binary String is divisible by 3.def CheckDivisibilty(A):    oddbits = 0;    evenbits = 0;    for counter in range(len(A)):         # checking if the bit is nonzero        if (A[counter] == '1'):             # checking if the nonzero bit is at even            # position            if (counter % 2 == 0):                evenbits+=1;            else:                oddbits+=1;                                # Checking if the difference of non-zero oddbits and    # evenbits is divisible by 3.    if (abs(oddbits - evenbits) % 3 == 0):        print("Yes" + "");    else:        print("No" + "");       # Driver Programif __name__ == '__main__':    A = "10101";    CheckDivisibilty(A);       # This code contributed by umadevi9616 Added code in Python
// C# Program to illustrate// DFA for multiple of 3using System; class GFG {         // checks if binary characters    // are multiple of 3    static bool isMultiple3(char []c, int size)    {        // initial state is 0th        char state = '0';             for (int i = 0; i < size; i++)        {                 // storing binary digit            char digit = c[i];                 switch (state)            {                     // when state is 0                case '0':                    if (digit == '1')                        state = '1';                    break;                         // when state is 1                case '1':                    if (digit == '0')                        state = '2';                    else                        state = '0';                    break;                         // when state is 2                case '2':                    if (digit == '0')                        state = '1';                    break;            }        }             // if final state is 0th state        if (state == '0')            return true;                     return false;    }     // Driver Code    public static void Main ()    {                 // size of binary array        int size = 5;             // array of binary numbers        // Here it is 21 in decimal        char []c = { '1', '0', '1', '0', '1' };             // if binary numbers are a multiple of 3        if (isMultiple3(c, size))            Console.WriteLine ("YES");        else            Console.WriteLine ("NO");    }} // This code is contributed by vt_m.
<?php// PHP Program to illustrate// DFA for multiple of 3 // checks if binary characters// are multiple of 3function isMultiple3($c,$size){         // initial state is 0th    $state = '0';     for ($i = 0; $i < $size; $i++)    {         // storing binary digit        $digit = $c[$i];         switch ($state)        {             // when state is 0            case '0':                if ($digit == '1')                    $state = '1';                break;                 // when state is 1            case '1':                if ($digit == '0')                    $state = '2';                else                    $state = '0';                break;                 // when state is 2            case '2':                if ($digit == '0')                    $state = '1';                break;        }    }     // if final state is 0th state    if ($state == '0')        return true;    return false;}     // Driver Code     // size of binary array    $size = 5;     // array of binary numbers    // Here it is 21 in decimal    $c= array('1', '0', '1', '0', '1');     // if binary numbers are    // a multiple of 3    if (isMultiple3($c, $size))        echo "YES\n";    else        echo "NO\n"; //This code is contributed by mits?>
<script> // JavaScript Program to illustrate// DFA for multiple of 3     // checks if binary characters    // are multiple of 3    function isMultiple3(c, size)    {        // initial state is 0th        let state = '0';              for (let i = 0; i < size; i++) {                  // storing binary digit            let digit = c[i];                  switch (state) {                  // when state is 0            case '0':                if (digit == '1')                    state = '1';                break;                  // when state is 1            case '1':                if (digit == '0')                    state = '2';                else                    state = '0';                break;                  // when state is 2            case '2':                if (digit == '0')                    state = '1';                break;            }        }              // if final state is 0th state        if (state == '0')            return true;        return false;    }     // Driver code         // size of binary array        let size = 5;              // array of binary numbers        // Here it is 21 in decimal        let c = [ '1', '0', '1', '0', '1' ];              // if binary numbers are a multiple of 3        if (isMultiple3(c, size))            document.write ("YES");        else            document.write ("NO"); </script>
YES
Time Complexity: O(n)Auxiliary Space: O(1)
Approach 2:We will check if the difference between the number of non-zero odd bit positions and non-zero even bit positions is divisible by 3 or not.
Mathematically -> |odds-evens| divisible by 3.
C++
Java
Python3
C#
Javascript
// C++ program to check if the binary string is divisible// by 3.#include <bits/stdc++.h>using namespace std;// Function to check if the binary string is divisible by 3.void CheckDivisibilty(string A){    int oddbits = 0, evenbits = 0;    for (int counter = 0; counter < A.length(); counter++) {        // checking if the bit is nonzero        if (A[counter] == '1') {            // checking if the nonzero bit is at even            // position            if (counter % 2 == 0) {                evenbits++;            }            else {                oddbits++;            }        }    }    // Checking if the difference of non-zero oddbits and    // evenbits is divisible by 3.    if (abs(oddbits - evenbits) % 3 == 0) {        cout << "Yes" << endl;    }    else {        cout << "No" << endl;    }}// Driver Programint main(){    string A = "10101";    CheckDivisibilty(A);    return 0;}
// Java program to check if the binary String is divisible// by 3.import java.util.*; class GFG{   // Function to check if the binary String is divisible by 3.static void CheckDivisibilty(String A){    int oddbits = 0, evenbits = 0;    for (int counter = 0; counter < A.length(); counter++)    {               // checking if the bit is nonzero        if (A.charAt(counter) == '1')        {                       // checking if the nonzero bit is at even            // position            if (counter % 2 == 0) {                evenbits++;            }            else {                oddbits++;            }        }    }       // Checking if the difference of non-zero oddbits and    // evenbits is divisible by 3.    if (Math.abs(oddbits - evenbits) % 3 == 0) {        System.out.print("Yes" +"\n");    }    else {        System.out.print("No" +"\n");    }}   // Driver Programpublic static void main(String[] args){    String A = "10101";    CheckDivisibilty(A);}} // This code is contributed by umadevi9616
# Python program to check if the binary String is divisible# by 3. # Function to check if the binary String is divisible by 3.def CheckDivisibilty(A):    oddbits = 0;    evenbits = 0;    for counter in range(len(A)):         # checking if the bit is nonzero        if (A[counter] == '1'):             # checking if the nonzero bit is at even            # position            if (counter % 2 == 0):                evenbits += 1;            else:                oddbits += 1;             # Checking if the difference of non-zero oddbits and    # evenbits is divisible by 3.    if (abs(oddbits - evenbits) % 3 == 0):        print("Yes" + "");    else:        print("No" + "");     # Driver Programif __name__ == '__main__':    A = "10101";    CheckDivisibilty(A);     # This code is contributed by umadevi9616.
// C# program to check if the binary String is divisible// by 3.using System; public class GFG{   // Function to check if the binary String is divisible by 3.static void CheckDivisibilty(String A){    int oddbits = 0, evenbits = 0;    for (int counter = 0; counter < A.Length; counter++)    {               // checking if the bit is nonzero        if (A[counter] == '1')        {                       // checking if the nonzero bit is at even            // position            if (counter % 2 == 0) {                evenbits++;            }            else {                oddbits++;            }        }    }       // Checking if the difference of non-zero oddbits and    // evenbits is divisible by 3.    if (Math.Abs(oddbits - evenbits) % 3 == 0) {        Console.Write("Yes" +"\n");    }    else {        Console.Write("No" +"\n");    }}   // Driver Programpublic static void Main(String[] args){    String A = "10101";    CheckDivisibilty(A);}} // This code is contributed by umadevi9616
<script>// javascript program to check if the binary String is divisible// by 3.     // Function to check if the binary String is divisible by 3.    function CheckDivisibilty( A) {        var oddbits = 0, evenbits = 0;        for (var counter = 0; counter < A.length; counter++) {             // checking if the bit is nonzero            if (A[counter] == '1') {                 // checking if the nonzero bit is at even                // position                if (counter % 2 == 0) {                    evenbits++;                } else {                    oddbits++;                }            }        }         // Checking if the difference of non-zero oddbits and        // evenbits is divisible by 3.        if (Math.abs(oddbits - evenbits) % 3 == 0) {            document.write("Yes" + "\n");        } else {            document.write("No" + "\n");        }    }     // Driver Program        var A = "10101";        CheckDivisibilty(A); // This code is contributed by umadevi9616</script>
Yes
Time Complexity:  O(n) where n is the number of bits.
Auxiliary Space: O(1)
Mithun Kumar
nidhi_biet
rutvik_56
susmitakundugoaldanga
prathamjha5683
umadevi9616
ranjanrohit840
divisibility
Bit Magic
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Little and Big Endian Mystery
Bits manipulation (Important tactics)
Binary representation of a given number
Josephus problem | Set 1 (A O(n) Solution)
Divide two integers without using multiplication, division and mod operator
C++ bitset and its application
Add two numbers without using arithmetic operators
Find the element that appears once
Bit Fields in C
Find the two non-repeating elements in an array of repeating elements/ Unique Numbers 2