📌  相关文章
📜  计数通过遵循某些规则将N减少到1所需的步数

📅  最后修改于: 2021-05-25 07:32:15             🧑  作者: Mango

给定一个正整数N 。找到将其最小化为1所需的步骤数。如果N是2的幂,则在单个步骤中将N减小为一半,否则N减小为N的差且其最接近的2的幂小于N。

例子:

Input : N = 2
Output : 1

Input : N = 20
Output : 3

简单方法:对于每个问题,一个非常简单且蛮力的方法是对N进行迭代,直到将其减少到1,其中减少涉及两种情况:

  1. N是2的幂:将n减少到n / 2
  2. N不是2的幂:将n减少为n –(2 ^ log2(n))

高效的方法:在开始实际结果之前,让我们先根据问题陈述看一下整数n的位表示形式。

  1. 当整数为2的幂时,在这种情况下,位表示仅包含一个置位,并且该位也保留得最多。因此,log2(n),即位位置减一是将其减少到n所需的步数。这也等于n-1中的设置位数。
  2. 当整数不是2的幂时,n – 2 ^(log2(n))的余数等于可以通过取消设置最左置位获得的整数。因此,在这种情况下,将一个设置的比特去除计数作为一个步骤。

因此,减少n所需步骤的实际答案等于n-1中设置的位数。可以使用循环或后文中描述的任何方法轻松计算出该值:整数中的Count Set位。

下面是上述方法的实现:

C++
// Cpp to find the number of step to reduce n to 1
// C++ program to demonstrate __builtin_popcount()
#include 
using namespace std;
  
// Function to return number of steps for reduction
int stepRequired(int n)
{
    // builtin function to count set bits
    return __builtin_popcount(n - 1);
}
  
// Driver program
int main()
{
    int n = 94;
    cout << stepRequired(n) << endl;
    return 0;
}


Java
// Java program to find the number of step to reduce n to 1
  
import java.io.*;
class GFG
{
    // Function to return number of steps for reduction
    static int stepRequired(int n)
    {
        // builtin function to count set bits
        return Integer.bitCount(n - 1);
    }
      
    // Driver program
    public static void  main(String []args)
    {
        int n = 94;
        System.out.println(stepRequired(n)); 
      
    }
}
  
  
// This code is contributed by 
// ihritik


Python3
# Python3 to find the number of step
# to reduce n to 1 
# Python3 program to demonstrate
# __builtin_popcount() 
  
# Function to return number of
# steps for reduction 
def stepRequired(n) :
  
    # step to count set bits 
    return bin(94).count('1')
  
# Driver Code
if __name__ == "__main__" :
  
    n = 94
    print(stepRequired(n))
  
# This code is contributed by Ryuga


C#
// C# program to find the number of step to reduce n to 1
  
using System;
class GFG
{
      
    // function to count set bits
    static int countSetBits(int n) 
    { 
    
        // base case 
        if (n == 0) 
            return 0; 
    
        else
    
            // if last bit set 
            // add 1 else add 0 
            return (n & 1) + countSetBits(n >> 1); 
    }
    // Function to return number of steps for reduction
    static int stepRequired(int n)
    {
       
        return countSetBits(n - 1);
    }
      
    // Driver program
    public static void Main()
    {
        int n = 94;
        Console.WriteLine(stepRequired(n)); 
      
    }
}
  
  
// This code is contributed by 
// ihritik


PHP


输出:
5