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.

**Method 1 (Simple but causes overflow):**

Keep on calculating the number formed and just check divisibility by n.

`/* 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"` `; ` ` ` `} ` `} ` |

*chevron_right*

*filter_none*

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.

**Method 2 (Doesn’t cause overflow) :**

In this solution, we just maintain the remainder if remainder is 0, the formed number is divisible by n otherwise not. This is the same technique that is used in Automata to remember the state. Here also we are remembering the state of divisibility of input number.

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 code ` `int` `main() ` `{ ` ` ` `CheckDivisibility(3); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

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 division

Check 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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Check divisibility of binary string by 2^k
- Check divisibility by 7
- To check divisibility of any large number by 999
- Check if a large number is divisibility by 15
- Sub-string Divisibility by 3 Queries
- Sub-string Divisibility by 11 Queries
- Maximum path sum for each position with jumps under divisibility condition
- Divisibility by 64 with removal of bits allowed
- Divisibility by 12 for a large number
- Repeated Unit Divisibility
- Maximize profit when divisibility by two numbers have associated profits
- Check if binary representations of 0 to N are present as substrings in given binary string
- Median in a stream of integers (running integers)
- Average of a stream of numbers
- Select a random number from stream, with O(1) space
- Find the first non-repeating character from a stream of characters
- Online algorithm for checking palindrome in a stream
- K'th largest element in a stream
- Queue based approach for first non-repeating character in a stream
- Find top k (or most frequent) numbers in a stream