Number of continuous reductions of A from B or B from A to make them (1, 1)
Last Updated :
05 Jul, 2021
Given two integers A and B, the task is to find the minimum number of operations required to change this pair to (1, 1). In each operation (A, B) can be changed to (A – B, B) where A > B.
Note: If there is no possible solution to reach (1, 1), print -1.
Examples:
Input: A = 7, B = 8
Output: 7
Explanation:
Operation 1: (A, B) => (7, 8) => (7, 1)
Operation 2: (A, B) => (7, 1) => (6, 1)
Operation 3: (A, B) => (6, 1) => (5, 1)
Operation 4: (A, B) => (5, 1) => (4, 1)
Operation 5: (A, B) => (4, 1) => (3, 1)
Operation 6: (A, B) => (3, 1) => (2, 1)
Operation 7: (A, B) => (2, 1) => (1, 1)
Input: A = 75, B = 17
Output: 10
Naive Approach: The idea is to use recursion and update the pair as (A, A – B), where A > B, and increase the number of operations required by 1. If at any step, any element of the pair is less than 1 then it is not possible to reach (1, 1).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1)
return -1;
if (a == 1 && b == 1)
return c;
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a - b, b, c + 1);
}
int main()
{
int a = 75;
int b = 17;
cout << minimumSteps(a, b, 0) << endl;
}
|
Java
class GFG{
static int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1 )
return - 1 ;
if (a == 1 && b == 1 )
return c;
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a - b, b, c + 1 );
}
public static void main(String []args)
{
int a = 75 ;
int b = 17 ;
System.out.println(minimumSteps(a, b, 0 ));
}
}
|
Python3
def minimumSteps(a, b, c):
if a < 1 or b < 1 :
return - 1
if a = = 1 and b = = 1 :
return c
if a < b:
a, b = b, a
return minimumSteps(a - b, b, c + 1 )
if __name__ = = "__main__" :
a = 75 ; b = 17
print (minimumSteps(a, b, 0 ))
|
C#
using System;
class GFG{
static int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1)
return -1;
if (a == 1 && b == 1)
return c;
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a - b, b, c + 1);
}
public static void Main()
{
int a = 75;
int b = 17;
Console.WriteLine(minimumSteps(a, b, 0));
}
}
|
Javascript
<script>
function minimumSteps(a, b, c)
{
if (a < 1 || b < 1)
return -1;
if (a == 1 && b == 1)
return c;
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a - b, b, c + 1);
}
let a = 75;
let b = 17;
document.write(minimumSteps(a, b, 0) + "<br>" );
</script>
|
Efficient Approach: The idea is to use the Euclidean algorithm to solve this problem. By this approach, we can go from (A, B) to (A % B, B) in the A/B steps. But if the minimum of the A and B is 1, then we can reach (1, 1) in A – 1 steps.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1)
{
return -1;
}
if (min(a, b) == 1)
{
return c + max(a, b) - 1;
}
if (a < b)
{
swap(a, b);
}
return minimumSteps(a % b, b, c + (a / b));
}
int main()
{
int a = 75, b = 17;
cout << minimumSteps(a, b, 0) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG{
static int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1 )
{
return - 1 ;
}
if (Math.min(a, b) == 1 )
{
return c + Math.max(a, b) - 1 ;
}
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a % b, b, c + (a / b));
}
public static void main(String[] args)
{
int a = 75 , b = 17 ;
System.out.print(
minimumSteps(a, b, 0 ) + "\n" );
}
}
|
Python3
def minimumSteps(a, b, c):
if a < 1 or b < 1 :
return - 1
if min (a, b) = = 1 :
return c + max (a, b) - 1
if a < b:
a, b = b, a
return minimumSteps(a % b, b, c + a / / b)
if __name__ = = "__main__" :
a = 75 ; b = 17
print (minimumSteps(a, b, 0 ))
|
C#
using System;
class GFG{
static int minimumSteps( int a, int b, int c)
{
if (a < 1 || b < 1)
{
return -1;
}
if (Math.Min(a, b) == 1)
{
return c + Math.Max(a, b) - 1;
}
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a % b, b, c + (a / b));
}
public static void Main()
{
int a = 75, b = 17;
Console.Write(minimumSteps(a, b, 0) + "\n" );
}
}
|
Javascript
<script>
function minimumSteps(a, b, c)
{
if (a < 1 || b < 1)
{
return -1;
}
if (Math.min(a, b) == 1)
{
return c + Math.max(a, b) - 1;
}
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
return minimumSteps(a % b, b, c + parseInt(a / b));
}
var a = 75, b = 17;
document.write(minimumSteps(a, b, 0) + "<br>" );
</script>
|
Share your thoughts in the comments
Please Login to comment...