Open In App

First number to leave an odd remainder after repetitive division by 2

Given two integers A and B, the task is to print the integer among the two, which will be converted to an odd integer by a smaller number of divisions by 2. If both the numbers get converted to an odd integer after the same number of operations, print -1. 

Examples:  



Input: A = 10 and B = 8 
Output: 10 
Explanation: 
Step 1: A/2 = 5, B/2 = 4 
Hence, A is first number to be converted to an odd integer.

Input: A = 20 and B = 12 
Output: -1 
Explanation: 
Step 1: A/2 = 10, B/2 = 6 
Step 2: A/2 = 5, B/2 = 3 
Hence, A and B are converted to an odd integer at the same time. 
 



Naive Approach: 
The simplest approach to solve the problem is as follows: 

Below is the implementation of the above approach: 




// C++ program to find the first
// number to be converted to an odd
// integer by repetitive division by 2
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the first number
// to be converted to an odd value
int odd_first(int a, int b)
{
     
    // Initial values
    int true_a = a;
    int true_b = b;
 
    // Perform repetitive divisions by 2
    while(a % 2 != 1 && b % 2 != 1)
    {
        a = a / 2;
        b = b / 2;
    }
 
    // If both become odd at same step
    if (a % 2 == 1 && b % 2 == 1)
        return -1;
 
    // If a is first to become odd
    else if (a % 2 == 1)
        return true_a;
 
    // If b is first to become odd
    else
        return true_b;
}
         
// Driver code
int main()
{
    int a = 10;
    int b = 8;
 
    cout << odd_first(a, b);
}
 
// This code is contributed by code_hunt




// Java program to find the first
// number to be converted to an odd
// integer by repetitive division by 2
import java.util.*;
import java.lang.Math;
import java.io.*;
 
class GFG{
     
// Function to return the first number
// to be converted to an odd value
static int odd_first(int a, int b)
{
     
    // Initial values
    int true_a = a;
    int true_b = b;
 
    // Perform repetitive divisions by 2
    while(a % 2 != 1 && b % 2 != 1)
    {
        a = a / 2;
        b = b / 2;
    }
 
    // If both become odd at same step
    if (a % 2 == 1 && b % 2 == 1)
        return -1;
 
    // If a is first to become odd
    else if (a % 2 == 1)
        return true_a;
 
    // If b is first to become odd
    else
        return true_b;
}
     
// Driver code
public static void main(String[] args)
{
    int a = 10;
    int b = 8;
 
    System.out.print(odd_first(a, b));
}
}
 
// This code is contributed by code_hunt




# Python3 program to find the first
# number to be converted to an odd
# integer by repetitive division by 2
 
# Function to return the first number
# to be converted to an odd value
def odd_first(a, b):
 
  # Initial values
  true_a = a
  true_b = b
 
  # Perform repetitive divisions by 2
  while(a % 2 != 1 and b % 2 != 1):
    a = a//2
    b = b//2
 
  # If both become odd at same step
  if a % 2 == 1 and b % 2 == 1:
    return -1
 
  # If a is first to become odd
  elif a % 2 == 1:
    return true_a
 
  # If b is first to become odd
  else:
    return true_b
 
# Driver Code
a, b = 10, 8
print(odd_first(a, b))




// C# program to find the first
// number to be converted to an odd
// integer by repetitive division by 2
using System;
 
class GFG{
     
// Function to return the first number
// to be converted to an odd value
static int odd_first(int a, int b)
{
     
    // Initial values
    int true_a = a;
    int true_b = b;
 
    // Perform repetitive divisions by 2
    while(a % 2 != 1 && b % 2 != 1)
    {
        a = a / 2;
        b = b / 2;
    }
 
    // If both become odd at same step
    if (a % 2 == 1 && b % 2 == 1)
        return -1;
 
    // If a is first to become odd
    else if (a % 2 == 1)
        return true_a;
 
    // If b is first to become odd
    else
        return true_b;
}
     
// Driver code
public static void Main()
{
    int a = 10;
    int b = 8;
 
    Console.Write(odd_first(a, b));
}
}
 
// This code is contributed by sanjoy_62




<script>
 
// Javascript program to find the first
// number to be converted to an odd
// integer by repetitive division by 2
 
// Function to return the first number
// to be converted to an odd value
function odd_first(a, b)
{
     
    // Initial values
    var true_a = a;
    var true_b = b;
 
    // Perform repetitive divisions by 2
    while(a % 2 != 1 && b % 2 != 1)
    {
        a = a / 2;
        b = b / 2;
    }
 
    // If both become odd at same step
    if (a % 2 == 1 && b % 2 == 1)
        return -1;
 
    // If a is first to become odd
    else if (a % 2 == 1)
        return true_a;
 
    // If b is first to become odd
    else
        return true_b;
}
 
// Driver code
var a = 10, b = 8;
 
document.write(odd_first(a, b));
 
// This code is contributed by Ankita saini
    
</script>

Output: 
10

 

Time complexity: O(log(min(a, b))) 
Auxiliary Space: O(1)

Efficient Approach: 
Follow the steps below to optimize the above approach:  

Below is the implementation of the above approach.  




// C++ Program to implement the
// above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the position
// least significant set bit
int getFirstSetBitPos(int n)
{
    return log2(n & -n) + 1;
}
 
// Function return the first number
// to be converted to an odd integer
int oddFirst(int a, int b)
{
 
    // Stores the positions of the
    // first set bit
    int steps_a = getFirstSetBitPos(a);
    int steps_b = getFirstSetBitPos(b);
 
    // If both are same
    if (steps_a == steps_b) {
        return -1;
    }
 
    // If A has the least significant
    // set bit
    if (steps_a > steps_b) {
        return b;
    }
 
    // Otherwise
    if (steps_a < steps_b) {
        return a;
    }
}
 
// Driver code
int main()
{
    int a = 10;
    int b = 8;
 
    cout << oddFirst(a, b);




// Java program implementation
// of the approach
import java.util.*;
import java.lang.Math;
import java.io.*;
 
class GFG{
     
// Function to return the position
// least significant set bit
static int getFirstSetBitPos(int n)
{
    return (int)(Math.log(n & -n) /
                 Math.log(2));
}
 
// Function return the first number
// to be converted to an odd integer
static int oddFirst(int a, int b)
{
     
    // Stores the positions of the
    // first set bit
    int steps_a = getFirstSetBitPos(a);
    int steps_b = getFirstSetBitPos(b);
 
    // If both are same
    if (steps_a == steps_b)
    {
        return -1;
    }
 
    // If A has the least significant
    // set bit
    else if (steps_a > steps_b)
    {
        return b;
    }
 
    // Otherwise
    else
    {
        return a;
    }
}
     
// Driver code
public static void main(String[] args)
{
    int a = 10;
    int b = 8;
 
    System.out.print(oddFirst(a, b));
}
}
 
// This code is contributed by code_hunt




# Python3 program to implement the
# above approach
from math import log
 
# Function to return the position
# least significant set bit
def getFirstSetBitPos(n):
    return log(n & -n, 2) + 1
 
# Function return the first number
# to be converted to an odd integer
def oddFirst(a, b):
 
    # Stores the positions of the
    # first set bit
    steps_a = getFirstSetBitPos(a)
    steps_b = getFirstSetBitPos(b)
 
    # If both are same
    if (steps_a == steps_b):
        return -1
 
    # If A has the least significant
    # set bit
    if (steps_a > steps_b):
        return b
 
    # Otherwise
    if (steps_a < steps_b):
        return a
 
# Driver code
if __name__ == '__main__':
     
    a = 10
    b = 8
     
    print(oddFirst(a, b))
 
# This code is contributed by mohit kumar 29




// C# program implementation
// of the approach
using System;
 
class GFG{
     
// Function to return the position
// least significant set bit
static int getFirstSetBitPos(int n)
{
    return (int)(Math.Log(n & -n) /
                 Math.Log(2));
}
 
// Function return the first number
// to be converted to an odd integer
static int oddFirst(int a, int b)
{
     
    // Stores the positions of the
    // first set bit
    int steps_a = getFirstSetBitPos(a);
    int steps_b = getFirstSetBitPos(b);
 
    // If both are same
    if (steps_a == steps_b)
    {
        return -1;
    }
 
    // If A has the least significant
    // set bit
    else if (steps_a > steps_b)
    {
        return b;
    }
 
    // Otherwise
    else
    {
        return a;
    }
}
     
// Driver code
public static void Main()
{
    int a = 10;
    int b = 8;
 
    Console.Write(oddFirst(a, b));
}
}
 
// This code is contributed by sanjoy_62




<script>
 
// Javascript program implementation
// of the approach
 
// Function to return the position
// least significant set bit
function getFirstSetBitPos(n)
{
    return (Math.log(n & -n) /
                 Math.log(2));
}
  
// Function return the first number
// to be converted to an odd integer
function oddFirst(a, b)
{
      
    // Stores the positions of the
    // first set bit
    let steps_a = getFirstSetBitPos(a);
    let steps_b = getFirstSetBitPos(b);
  
    // If both are same
    if (steps_a == steps_b)
    {
        return -1;
    }
  
    // If A has the least significant
    // set bit
    else if (steps_a > steps_b)
    {
        return b;
    }
  
    // Otherwise
    else
    {
        return a;
    }
}
   
 
// Driver Code
     
       let a = 10;
    let b = 8;
  
    document.write(oddFirst(a, b));
         
</script>

Output: 
10

 

Time complexity: O(1) 
Auxiliary Space: O(1)
 


Article Tags :