Largest Prime Number possible from a subsequence of a Binary String - GeeksforGeeks

09 Jul, 2021
Given a Binary string, the task is to find the largest Prime Number possible by the decimal representation of a subsequence of the given binary string. If no prime number can be obtained, print -1.
Examples:
Input: S = “1001”Output: 5 Explanation: Out of all subsequences of the string “1001”, the largest prime number that can be obtained is “101” (= 5).
Input: “1011”Output: 11 Explanation: Out of all subsequences of the string “1011”, the largest prime number that can be obtained is “1011” (= 11).
Approach:  To solve the problem, the idea is to generate all possible subsequences of the string, and convert each subsequence to its equivalent decimal form. Print the largest prime number obtained from this subsequences. 
Follow the steps below to solve this problem:
Initialize a vector of pairs, say vec, for storing pairs of strings and their equivalent decimal values, in Pair.first and Pair.second respectively.
Initialize a variable, say ans, to store the required answer.
Iterate a loop from i = 0 to length of the string s:Iterate a loop from j = 0 to the length of vec:Store the jth pair in temp.If the ith character of string s is ‘1‘:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 1 to it.Otherwise:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 0 to it.Store this temp pair into vec.If the temp.second is prime:Store max of ans and temp.second in ans.If ans is equal to 0:No prime number can be obtained from the string s.Otherwise:Print ans.
Iterate a loop from j = 0 to the length of vec:Store the jth pair in temp.If the ith character of string s is ‘1‘:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 1 to it.Otherwise:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 0 to it.Store this temp pair into vec.If the temp.second is prime:Store max of ans and temp.second in ans.
Store the jth pair in temp.
If the ith character of string s is ‘1‘:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 1 to it.
Add the character in temp.first.
Update the value of temp.second by left shifting the current value and adding 1 to it.
Otherwise:Add the character in temp.first.Update the value of temp.second by left shifting the current value and adding 0 to it.
Add the character in temp.first.
Update the value of temp.second by left shifting the current value and adding 0 to it.
Store this temp pair into vec.
If the temp.second is prime:Store max of ans and temp.second in ans.
Store max of ans and temp.second in ans.
If ans is equal to 0:No prime number can be obtained from the string s.
No prime number can be obtained from the string s.
Otherwise:Print ans.
Print ans.
Below is the implementation of the above approach:
C++
Python3
Javascript
// C++ Program to implement// the above approach #include <iostream>#include <vector>using namespace std; // Function to check if a// number is prime or notbool isPrime(int x){    if (x <= 1)        return false;     for (int i = 2; i * i <= x; i++) {        if (x % i == 0)             // Return not prime            return false;    }     // If prime return true    return true;} // Function to find the largest prime// number possible from a subsequencevoid largestPrime(string s){     // Stores pairs of subsequences and    // their respective decimal value    vector<pair<string, int> > vec{ { "", 0 } };     // Stores the answer    int ans = 0;     // Traverse the string    for (int i = 0; i < s.length(); i++) {        // Stores the size of the vector        int n = vec.size();         // Traverse the vector        for (int j = 0; j < n; j++) {             // Extract the current pair            pair<string, int> temp = vec[j];             // Get the binary string from the pair            string str = temp.first;             // Stores equivalent decimal values            int val = temp.second;             // If the current character is '1'            if (s[i] == '1') {                // Add the character                // to the subsequence                temp.first = str + '1';                 // Update the value by left                // shifting the current                // value and adding 1 to it                temp.second = ((val << 1) + 1);            }             // If s[i]=='0'            else {                 // Add the character                // to the subsequence                temp.first = str + '0';                 // Update the value by left                // shifting the current                // value and adding 0 to it                temp.second = ((val << 1) + 0);            }             // Store the subsequence in the vector            vec.push_back(temp);             // Check if the decimal            // representation of current            // subsequence is prime or not            int check = temp.second;             // If prime            if (isPrime(check)) {                // Update the answer                // with the largest one                ans = max(ans, check);            }        }    }     // If no prime number    // could be obtained    if (ans == 0)        cout << -1 << endl;    else        cout << ans << endl;} // Driver Codeint main(){    // Input String    string s = "110";     largestPrime(s);     return 0;}
# Python3 program to implement# the above approach # Function to check if a# number is prime or notdef isPrime(x):         if (x <= 1):        return False     for i in range(2, x + 1):        if i * i > x:            break                 if (x % i == 0):                         # Return not prime            return False     # If prime return true    return True # Function to find the largest prime# number possible from a subsequencedef largestPrime(s):     # Stores pairs of subsequences and    # their respective decimal value    vec = [["", 0]]         # Stores the answer    ans = 0     # Traverse the string    for i in range(len(s)):                 # Stores the size of the vector        n = len(vec)         # Traverse the vector        for j in range(n):                         # Extract the current pair            temp = vec[j]             # Get the binary string from the pair            str = temp[0]             # Stores equivalent decimal values            val = temp[1]             # If the current character is '1'            if (s[i] == '1'):                                 # Add the character                # to the subsequence                temp[0] = str + '1'                 # Update the value by left                # shifting the current                # value and adding 1 to it                temp[1] = ((val << 1) + 1)             # If s[i]=='0'            else:                 # Add the character                # to the subsequence                temp[0] = str + '0'                 # Update the value by left                # shifting the current                # value and adding 0 to it                temp[1] = ((val << 1) + 0)             # Store the subsequence in the vector            vec.append(temp)             # Check if the decimal            # representation of current            # subsequence is prime or not            check = temp[1]             # If prime            if (isPrime(check)):                                 # Update the answer                # with the largest one                ans = max(ans, check)                break     # If no prime number    # could be obtained    if (ans == 0):        print(-1)    else:        print(ans) # Driver Codeif __name__ == '__main__':         # Input String    s = "110"     largestPrime(s) # This code is contributed by mohit kumar 29
<script> // JavaScript Program to implement// the above approach // Function to check if a// number is prime or notfunction isPrime(x) {    if (x <= 1)        return false;     for (let i = 2; i * i <= x; i++) {        if(i * i > x){            break        }        if (x % i == 0)             // Return not prime            return false;    }     // If prime return true    return true;} // Function to find the largest prime// number possible from a subsequencefunction largestPrime(s) {     // Stores pairs of subsequences and    // their respective decimal value    let vec = [["", 0]];     // Stores the answer    let ans = 0;     // Traverse the string    for (let i = 0; i < s.length; i++) {        // Stores the size of the vector        let n = vec.length;         // Traverse the vector        for (let j = 0; j < n; j++) {             // Extract the current pair            let temp = vec[j];             // Get the binary string from the pair            let str = temp[0];             // Stores equivalent decimal values            let val = temp[1];             // If the current character is '1'            if (s[i] == '1') {                // Add the character                // to the subsequence                temp[0] = str + '1';                 // Update the value by left                // shifting the current                // value and adding 1 to it                temp[1] = ((val << 1) + 1);            }             // If s[i]=='0'            else {                 // Add the character                // to the subsequence                temp[0] = str + '0';                 // Update the value by left                // shifting the current                // value and adding 0 to it                temp[1] = ((val << 1) + 0);            }             // Store the subsequence in the vector            vec.push(temp);             // Check if the decimal            // representation of current            // subsequence is prime or not            let check = temp[1];             // If prime            if (isPrime(check)) {                // Update the answer                // with the largest one                ans = Math.max(ans, check);                break            }        }    }     // If no prime number    // could be obtained    if (ans == 0)        document.write(-1 + "<br>");    else        document.write(ans + "<br>");} // Driver Code // Input Stringlet s = "110"; largestPrime(s); </script>
3
 
Time Complexity: O(2N * √N), where N is the length of the string.Auxiliary Space: O(2N * N)
 
mohit kumar 29
gfgking
binary-representation
binary-string
Prime Number
subsequence
Bit Magic
Mathematical
Strings
Strings
Mathematical
Bit Magic
Prime Number
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Cyclic Redundancy Check and Modulo-2 Division
Little and Big Endian Mystery
Add two numbers without using arithmetic operators
Find the element that appears once
Bits manipulation (Important tactics)
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7