当前位置: 首页 > 编程笔记 >

遵循C ++中的某些规则,将N减少为1所需的步数

章嘉致
2023-03-14
本文向大家介绍遵循C ++中的某些规则,将N减少为1所需的步数,包括了遵循C ++中的某些规则,将N减少为1所需的步数的使用技巧和注意事项,需要的朋友参考一下

给我们一个数字N。目标是通过遵循以下规则来计算将数字减少为1所需的步骤数-

  • 如果该数字为2的幂,则将其减小为一半。

  • 否则将其减小到N-(小于2的最近方幂)。

对于步骤1,我们将通过检查ceil(log2(N)),floor(log2(N))是否返回相同的结果来检查N是否为2的幂。如果是,则N = N / 3,增加操作计数。

如果步骤1的结果为假,那么我们将执行步骤2,并从N中减去小于N的最近幂2。小于N的最近幂2将计算为-

x = floor(log2(N))→当N不是2的幂时,log2(N)给出浮点值,下限将其减小为小于N的最接近整数。

现在N = N-pow(2,x)→pow(2,x)将给出比N小2的最接近幂。减小N。

让我们通过示例来理解。

输入-N = 20

输出-:所需步骤数-3

说明-N = 20

20 is not power of 2. Step 2. Reduce nearest power of 2 less than N from N. N=20- 16=4. Count=1.
4 is power of 2. Step 1. Reduce N to its half. N=4/2=2. Count=2.
2 is power of 2. Step 1. Reduce N to its half. N=2/2=1. Count=3.
N is 1 total step count=3.

输入-N = 32

输出所需步数-5

说明-N = 32

32 is power of 2. Step 1. Reduce N to its half. N=32/2=16. Count=1.
16 is power of 2. Step 1. Reduce N to its half. N=16/2=8. Count=2.
8 is power of 2. Step 1. Reduce N to its half. N=8/2=4. Count=3.
4 is power of 2. Step 1. Reduce N to its half. N=4/2=2. Count=4.
2 is power of 2. Step 1. Reduce N to its half. N=2/2=1. Count=5.
N is 1 total step count=5.

以下程序中使用的方法如下

  • 我们采用整数N来存储整数值。

  • 函数stepCount(int n)取N并返回将其减少到1所需的步数。

  • 将步骤的初始计数设为0。

  • 现在while(n!= 1)根据n的值执行步骤1和2。

  • 如果n为2的幂(ceil(log2(n))== floor(log2(n))为true),则将n减半。增量计数。

  • 如果不是2的幂,则将n减小pow(2,x),其中x是floor(log2(n))。增量计数。

  • 当循环结束时,计数将执行的操作数。

  • 返回计数为所需结果。

示例

#include <iostream>
#include <math.h>
using namespace std;
//返回减少步数的功能
int stepCount(int n){
   int count=0;
   while(n!=1){
      if(ceil(log2(n))==floor(log2(n))) //if n is power of 2 then this is true{
         n=n/2; //reduce n to half
         count++;
      } else {
         int x=floor(log2(n)); //floor value
         n=n-(pow(2,x)); //2^x is nearest power of 2 which is less than n
         count++;
      }
   }
   return count;
}
int main(){
   int N = 96;
   cout <<"将N减少为1所需的步骤数:"<<stepCount(N);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

将N减少为1所需的步骤数:6
 类似资料:
  • 本文向大家介绍使用HTML5需要遵守哪些规则?相关面试题,主要包含被问及使用HTML5需要遵守哪些规则?时的应答技巧和注意事项,需要的朋友参考一下 * 新的特性应该基于HTML、CSS、DOM和JavaScript * 减少对外部插件的需求(如Flash) * 更好的错误处理 * 更多的替换脚本的标记 * HTML5应与设备无关 * 开发过程必须可视化

  • 本文向大家介绍覆盖在Java中引发异常的方法时,需要遵循哪些规则?,包括了覆盖在Java中引发异常的方法时,需要遵循哪些规则?的使用技巧和注意事项,需要的朋友参考一下  当我们重写抛出Exception的方法时,我们需要遵循一些规则。 当父类方法 未引发任何异常时,子类方法将不会引发任何已检查的异常,但它可能会引发任何未检查的异常。 当 父类方法抛出一个或多个检查异常时,子类方法可以抛出任何未检查

  • 本文向大家介绍在使用HTML5时有哪些规则需要遵守?相关面试题,主要包含被问及在使用HTML5时有哪些规则需要遵守?时的应答技巧和注意事项,需要的朋友参考一下 使用HTML5需要遵守哪些规则? 新的特性应该基于HTML、CSS、DOM和JavaScript 减少对外部插件的需求(如Flash) 更好的错误处理 更多的替换脚本的标记 HTML5应与设备无关 开发过程必须可视化

  • 所以我现在的规则是这样的。 我的问题是,即使在写到子集合时,它是否会准确地检查用户是否在group1->doc->subcollection->doc-'members'中,或者在这种情况下,它是否会签入group1->doc->subcollection->doc-'members'? 因为members列表只在groups集合中,而不在子集合中,所以不希望出现第二种情况。

  • 运算符重载是通过函数重载实现的,概念上大家都很容易理解,这节我们来说一下运算符重载的注意事项。 1) 并不是所有的运算符都可以重载。能够重载的运算符包括: +  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=  <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,

  • 看到了以下线程: Java8流编译器消息——局部变量必须是final或实际上是final lambda表达式中的变量赋值 根据JavaDoc 在lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为final或有效final(§4.12.4),否则在尝试使用时会出现编译时错误。 在lambda主体中使用但未声明的任何局部变量必须在lambda主体之前明确赋值(§16(明确赋值