📌  相关文章
📜  使用给定操作的最小数量将数字m转换为n

📅  最后修改于: 2021-04-29 06:04:29             🧑  作者: Mango

用最少的运算将数字m转换为n。允许的操作是:

  1. 乘以2,即m = 2 * m
  2. 减去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