Check divisibility in a binary stream - GeeksforGeeks

30 May, 2018
Stream of binary number is coming, the task is to tell the number formed so far is divisible by a given number n.At any given time, you will get 0 or 1 and tell whether the number formed with these bits is divisible by n or not.
Generally, e-commerce companies ask this type of questions. It was asked me in Microsoft interview. Actually that question was a bit simple, interviewer fixed the n to 3.
/* Simple implementation of the logic,   without error handling compiled with   Microsoft visual studio 2015 */void CheckDivisibility2(int n){    int num = 0;    std::cout << "press any key other than"                " 0 and 1 to terminate \n";    while (true)    {        int incomingBit;          // read next incoming bit via standard        // input. 0, 00, 000.. are same as int 0        // ans 1, 01, 001, 00..001 is same as 1.        std::cin >> incomingBit;          // Update value of num formed so far        if (incomingBit == 1)            num = (num * 2 + 1);        else if (incomingBit == 0)            num = (num * 2);          else            break;        if (num % n == 0)            std::cout << "yes \n";        else            std::cout << "no \n";    }}
Problem in this solution: What about the overflow. Since 0 and 1 will keep on coming and the number formed will go out of range of integer.
 
In order to implement this technique, we need to observe how the value of a binary number changes, when it is appended by 0 or 1.
Let’s take an example. Suppose you have binary number 1.If it is appended by 0 it will become 10 (2 in decimal) means 2 times of the previous value.If it is appended by 1 it will become 11(3 in decimal), 2 times of previous value +1.
How does it help in getting the remainder?Any number (n) can be written in the form m = an + r where a, n and r are integers and r is the remainder. So when m is multiplied by any number so the remainder. Suppose m is multiplied by x so m will be mx = xan + xr. so (mx)%n = (xan)%n + (xr)%n = 0 + (xr)%n = (xr)%n;
We need to just do the above calculation (calculation of value of number when it is appended by 0 or 1 ) only over remainder.
When a binary number is appended by 0 (means 
multiplied by 2), the new remainder can be 
calculated based on current remainder only.
r = 2*r % n;

And when a binary number is appended by 1.
r = (2*r + 1) % n; 
// C++ program to check divisibility in a stream#include <iostream>using namespace std;  /*  A very simple implementation of the logic,    without error handling. just to demonstrate    the above theory. This simple version not    restricting user from typing 000, 00 , 000.. ,    because this all will be same as 0 for integer    same is true for 1, 01, 001, 000...001 is same    as 1, so ignore this type of error handling    while reading just see the main logic is correct. */void CheckDivisibility(int n){    int remainder = 0;    std::cout << "press any key other than 0"                 " and 1 to terminate \n";    while (true)    {        // Read next incoming bit via standard        // input. 0, 00, 000.. are same as int 0        // ans 1, 01, 001, 00..001 is same as 1.        int incomingBit;        cin >> incomingBit;          // Update remainder        if (incomingBit == 1)            remainder = (remainder * 2 + 1) % n;        else if (incomingBit == 0)            remainder = (remainder * 2) % n;        else            break;          // If remainder is 0.        if (remainder % n == 0)            cout << "yes \n";        else            cout << "no \n";    }}  // Driver codeint main(){    CheckDivisibility(3);    return 0;}
Input:
1
0
1
0
1
-1

Output:
Press any key other than 0 and 1 to terminate 
no 
no 
no 
no 
yes 

Related Articles:DFA based divisionCheck if a stream is Multiple of 3
This article is contributed by Puneet. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
array-stream
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
Cyclic Redundancy Check and Modulo-2 Division
Binary representation of a given number
Add two numbers without using arithmetic operators
Josephus problem | Set 1 (A O(n) Solution)
Bit Fields in C
Find the element that appears once
Bits manipulation (Important tactics)
Set, Clear and Toggle a given bit of a number in C
C++ bitset and its application