Check divisibility of binary string by 2^k
Given a binary string and a number k, the task is to check whether the binary string is evenly divisible by 2k or not.
Examples :
Input : 11000 k = 2 Output : Yes Explanation : (11000)2 = (24)10 24 is evenly divisible by 2k i.e. 4. Input : 10101 k = 3 Output : No Explanation : (10101)2 = (21)10 21 is not evenly divisible by 2k i.e. 8.
Naive Approach: Compute the binary string into decimal and then simply check whether it is divisible by 2k. But, this approach is not feasible for the long binary strings as time complexity will be high for computing decimal number from binary string and then dividing it by 2k.
Efficient Approach: In the binary string, check for the last k bits. If all the last k bits are 0, then the binary number is evenly divisible by 2k else it is not evenly divisible. Time complexity using this approach is O(k).
Below is the implementation of the approach.
C++
// C++ implementation to check whether // given binary number is evenly // divisible by 2^k or not #include <bits/stdc++.h> using namespace std; // function to check whether // given binary number is // evenly divisible by 2^k or not bool isDivisible( char str[], int k) { int n = strlen (str); int c = 0; // count of number of 0 from last for ( int i = 0; i < k; i++) if (str[n - i - 1] == '0' ) c++; // if count = k, number is evenly // divisible, so returns true else // false return (c == k); } // Driver program to test above int main() { // first example char str1[] = "10101100" ; int k = 2; if (isDivisible(str1, k)) cout << "Yes" << endl; else cout << "No" << "\n" ; // Second example char str2[] = "111010100" ; k = 2; if (isDivisible(str2, k)) cout << "Yes" << endl; else cout << "No" << endl; return 0; } |
Java
// Java implementation to check whether // given binary number is evenly // divisible by 2^k or not class GFG { // function to check whether // given binary number is // evenly divisible by 2^k or not static boolean isDivisible(String str, int k) { int n = str.length(); int c = 0 ; // count of number of 0 from last for ( int i = 0 ; i < k; i++) if (str.charAt(n - i - 1 ) == '0' ) c++; // if count = k, number is evenly // divisible, so returns true else // false return (c == k); } // Driver program to test above public static void main(String args[]) { // first example String str1 = "10101100" ; int k = 2 ; if (isDivisible(str1, k) == true ) System.out.println( "Yes" ); else System.out.println( "No" ); // Second example String str2 = "111010100" ; k = 2 ; if (isDivisible(str2, k) == true ) System.out.println( "Yes" ); else System.out.println( "No" ); } } // This code is contributed by JaideepPyne. |
Python3
# Python 3 implementation to check # whether given binary number is # evenly divisible by 2^k or not # function to check whether # given binary number is # evenly divisible by 2^k or not def isDivisible( str , k): n = len ( str ) c = 0 # count of number of 0 from last for i in range ( 0 , k): if ( str [n - i - 1 ] = = '0' ): c + = 1 # if count = k, number is evenly # divisible, so returns true else # false return (c = = k) # Driver program to test above # first example str1 = "10101100" k = 2 if (isDivisible(str1, k)): print ( "Yes" ) else : print ( "No" ) # Second example str2 = "111010100" k = 2 if (isDivisible(str2, k)): print ( "Yes" ) else : print ( "No" ) # This code is contributed by Smitha |
C#
// C# implementation to check whether // given binary number is evenly // divisible by 2^k or not using System; class GFG { // function to check whether // given binary number is // evenly divisible by 2^k or not static bool isDivisible(String str, int k) { int n = str.Length; int c = 0; // count of number of 0 from last for ( int i = 0; i < k; i++) if (str[n - i - 1] == '0' ) c++; // if count = k, number is evenly // divisible, so returns true else // false return (c == k); } // Driver program to test above public static void Main() { // first example String str1 = "10101100" ; int k = 2; if (isDivisible(str1, k) == true ) Console.Write( "Yes\n" ); else Console.Write( "No" ); // Second example String str2 = "111010100" ; k = 2; if (isDivisible(str2, k) == true ) Console.Write( "Yes" ); else Console.Write( "No" ); } } // This code is contributed by Smitha. |
PHP
<?php // PHP implementation to check whether // given binary number is evenly // function to check whether // given binary number is // evenly divisible by 2^k or not function isDivisible( $str , $k ) { $n = strlen ( $str ); $c = 0; // count of number // of 0 from last for ( $i = 0; $i < $k ; $i ++) if ( $str [ $n - $i - 1] == '0' ) $c ++; // if count = k, // number is evenly // divisible, so // returns true else // false return ( $c == $k ); } // Driver Code // first example $str1 = "10101100" ; $k = 2; if (isDivisible( $str1 , $k )) echo "Yes" , "\n" ; else echo "No" , "\n" ; // Second example $str2 = "111010100" ; $k = 2; if (isDivisible( $str2 , $k )) echo "Yes" , "\n" ; else echo "No" , "\n" ; // This code is contributed by Ajit ?> |
Javascript
<script> // Javascript implementation to check whether // given binary number is evenly // divisible by 2^k or not // Function to check whether // given binary number is // evenly divisible by 2^k or not function isDivisible(str, k) { let n = str.length; let c = 0; // Count of number of 0 from last for (let i = 0; i < k; i++) if (str[n - i - 1] == '0' ) c++; // If count = k, number is evenly // divisible, so returns true else // false return (c == k); } // Driver code // First example let str1 = "10101100" ; let k = 2; if (isDivisible(str1, k) == true ) document.write( "Yes" + "</br>" ); else document.write( "No" ); // Second example let str2 = "111010100" ; k = 2; if (isDivisible(str2, k) == true ) document.write( "Yes" ); else document.write( "No" ); // This code is contributed by rameshtravel07 </script> |
Output
Yes Yes
Complexity Analysis:
- Time Complexity: O(k)
- Auxiliary Space: O(1)
Please Login to comment...