用最少的运算将数字m转换为n。允许的操作是:
- 乘以2,即m = 2 * m
- 减去1,即m = m – 1
如果无法转换,则打印-1。
例子 :
Input : m = 3, n = 11
Output : 3
1st operation: *2 = 3*2 = 6
2nd operation: *2 = 6*2 = 12
3rd operation: -1 = 12-1 = 11
Input : m = 15, n = 20
Output : 6
1st operation: -1 '5' times = 15 + (-1*5) = 10
2nd operation: *2 = 10*2 = 20
Input : m = 0, n = 8
Output : -1
Using the given set of operations 'm'
cannot be converted to 'n'
Input : m = 12, n = 8
Output : 4
这个想法是基于以下事实。
1)如果m小于0且n大于0,则不可能。
2)如果m大于n,则仅使用减法就可以达到n。
3)否则(m小于n),我们必须执行m * 2运算。接下来出现两种情况。
……a)如果n为奇数,我们必须进行-1运算才能达到它。
……b)如果n为偶数,则必须执行* 2运算才能达到它。
算法:
int convert(m,n)
if (m == n)
return 0;
// not possible
if (m <= 0 && n > 0)
return -1;
// m is greater than n
if (m > n)
return m-n;
// n is odd
if (n % 2 == 1)
// perform '-1'
return 1 + convert(m, n+1);
// n is even
else
// perform '*2'
return 1 + convert(m, n/2);
注意:如此生成的操作列表应按相反顺序应用。
例如:
m = 3, n = 11
convert(3,11)
| --> n is odd: operation '-1'
convert(3,12)
| --> n is even: operation '*2'
convert(3,6)
| --> n is even: operation '*2'
convert(3,3)
| --> m == n
return
Therefore, the sequence of operations is '*2', '*2', '-1'.
C++
// C++ implementation to convert
// a number m to n using minimum
// number of given operations
#include
using namespace std;
// Function to find minimum
// number of given operations
// to convert m to n
int convert(int m, int n)
{
if (m == n)
return 0;
// only way is to do
// -1 (m - n) times
if (m > n)
return m - n;
// not possible
if (m <= 0 && n > 0)
return -1;
// n is greater and n is odd
if (n % 2 == 1)
// perform '-1' on m
// (or +1 on n)
return 1 + convert(m, n + 1);
// n is even
else
// perform '*2' on m
// (or n/2 on n)
return 1 + convert(m, n / 2);
}
// Driver code
int main()
{
int m = 3, n = 11;
cout << "Minimum number of operations : "
<< convert(m, n);
return 0;
}
Java
// Java implementation to convert
// a number m to n using minimum
// number of given operations
class ConvertNum
{
// function to find minimum
// number of given operations
// to convert m to n
static int convert(int m, int n)
{
if (m == n)
return 0;
// only way is to do
// -1 (m - n) times
if (m > n)
return m - n;
// not possible
if (m <= 0 && n > 0)
return -1;
// n is greater and n is odd
if (n % 2 == 1)
// perform '-1' on m
// (or +1 on n)
return 1 + convert(m, n + 1);
// n is even
else
// perform '*2' on m
// (or n / 2 on n)
return 1 + convert(m, n / 2);
}
// Driver Code
public static void main (String[] args)
{
int m = 3, n = 11;
System.out.println("Minimum number of " +
"operations : " +
convert(m, n));
}
}
Python3
# Python implementation to convert
# a number m to n using minimum
# number of given operations
# Function to find minimum
# number of given operations
# to convert m to n
def conver(m, n):
if(m == n):
return 0
# only way is to do
# -1(m - n): times
if(m > n):
return m - n
# not possible
if(m <= 0 and n > 0):
return -1
# n is greater and n is odd
if(n % 2 == 1):
# perform '-1' on m
#(or +1 on n):
return 1 + conver(m, n + 1)
# n is even
else:
# perform '*2' on m
#(or n/2 on n):
return 1 + conver(m, n / 2)
# Driver code
m = 3
n = 11
print("Minimum number of operations :",
conver(m, n))
# This code is contributed by
# Sanjit_Prasad
C#
// C# implementation to convert
// a number m to n using minimum
// number of given operations
using System;
class GFG
{
// function to find minimum
// number of given operations
// to convert m to n
static int convert(int m, int n)
{
if (m == n)
return 0;
// only way is to do
// -1 (m - n) times
if (m > n)
return m - n;
// not possible
if (m <= 0 && n > 0)
return -1;
// n is greater and n is odd
if (n % 2 == 1)
// perform '-1' on m
// (or +1 on n)
return 1 + convert(m, n + 1);
// n is even
else
// perform '*2' on m
// (or n / 2 on n)
return 1 + convert(m, n / 2);
}
// Driver code
public static void Main ()
{
int m = 3, n = 11;
Console.Write("Minimum number of " +
"operations : " +
convert(m, n));
}
}
// This code is contributed by nitin mittal
PHP
$n)
return $m - $n;
// not possible
if ($m <= 0 && $n > 0)
return -1;
// n is greater and n is odd
if ($n % 2 == 1)
// perform '-1' on m
// (or +1 on n)
return 1 + convert($m, $n + 1);
// n is even
else
// perform '*2' on m
// (or n/2 on n)
return 1 + convert($m, $n / 2);
}
// Driver code
{
$m = 3; $n = 11;
echo "Minimum number of ".
"operations : ",
convert($m, $n);
return 0;
}
// This code is contributed
// by nitin mittal.
?>
Javascript
输出 :
Minimum number of operations : 3