对一个正整数n,算得到1需要的最少操作次数。
2014-08-05 22:08
260 查看
实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去
int func(unsigned int n)
{
if(n == 1)
return 0;
if(n % 2 == 0)
return 1 + func(n/2);
int x = func(n + 1);
int y = func(n - 1);
if(x > y)
return y+1;
else
return x+1;
}
假设n表示成二进制有x bit,可以看出计算复杂度为O(2^x),也就是O(n)。
将n转换到二进制空间来看(比如7为111,6为110):
- 如果最后一位是0,则对应于偶数,直接进行除2操作。
- 如果最后一位是1,情况则有些复杂。
**如果最后几位是???01,则有可能为???001,???1111101。在第一种情况下,显然应该-1;在第二种情况下-1和+1最终需要的步数相同。所以在???01的情况下,应该选择-1操作。
**如果最后几位是???011,则有可能为???0011,???11111011。在第一种情况下,+1和-1最终需要的步数相同;在第二种情况下+1步数更少些。所以在???011的情况下,应该选择+1操作。
**如果最后有更多的连续1,也应该选择+1操作。
如果最后剩下的各位都是1,则有11时应该选择-1;111时+1和-1相同;1111时应选择+1;大于四个1时也应该选择+1;
int func(unsigned int n)
{
if(n == 1)
return 0;
if(n % 2 == 0)
return 1 + func(n/2);
if(n == 3)
return 2;
if(n&2)
return 1 + func(n+1);
else
return 1 + func(n-1);
}
由以上的分析可知,奇数的时候加1或减1,完全取决于二进制的后两位,如果后两位是10、00那么肯定是偶数,选择除以2,如果后两位是01、11,那么选择结果会不一样的,如果是*****01,那么选择减1,如果是*****11,那么选择加1,特殊情况是就是n是3的时候,选择减1操作。
非递归代码如下:
// 非递归写法
int func(int n)
{
int count = 0;
while(n > 1)
{
if(n % 2 == 0)
n >>= 1;
else if(n == 3)
n--;
else
{
if(n&2) // 二进制是******11时
n++;
else // 二进制是******01时
n--;
}
count++;
}
return count;
}
相关文章推荐
- 对一个正整数n,算得到1需要的最少操作次数
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数:
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 面试题:对一个正整数n,算得到1需要的最少操作次数
- 比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
- 正整数n,算得到1需要的最少操作次数
- 1、对一个正整数算到1需要的最少操作次数
- 算得到1需要的最少操作次数
- 对正整数,算得到1需要操作的次数
- 1、对一个正整数算到1需要的最少操作次数
- 算得到1需要的最少操作次数
- Hdu 5812 Distance(三种操作. 1.插入x 2.删除x 3.在集合中找到一个数y,使得y->x,每次能除以一个素数或者乘上一个素数,问最少的操作次数)
- 本来从动态壁纸预览页面设置一个动态壁纸回到桌面便可以看到桌面动态壁纸,可以观察得到自己的动态壁纸是否设置成功了(必须知道设置是否成功的结构,因为还有一些操作需要完成)! 但是现在是要在自己的应用中进入
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- hdu 4628 每次消掉一个回文串需要的最少次数 很帅的题
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- 给定一个字符串,切分该字符串,使得到的子串都是回文字符串,计算最少的切分次数。