给我们一个数字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(明确赋值