给定一个正整数 。找到将其最小化为1所需的步骤数。如果N是2的幂,则在单个步骤中将N减小为一半,否则N减小为N的差且其最接近的2的幂小于N。
例子:
Input : N = 2
Output : 1
Input : N = 20
Output : 3
简单方法:对于每个问题,一个非常简单且蛮力的方法是对N进行迭代,直到将其减少到1,其中减少涉及两种情况:
- N是2的幂:将n减少到n / 2
- N不是2的幂:将n减少为n –(2 ^ log2(n))
高效的方法:在开始实际结果之前,让我们先根据问题陈述看一下整数n的位表示形式。
- 当整数为2的幂时,在这种情况下,位表示仅包含一个置位,并且该位也保留得最多。因此,log2(n),即位位置减一是将其减少到n所需的步数。这也等于n-1中的设置位数。
- 当整数不是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