实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
来源:互联网 发布:韩剧秘密知乎 编辑:程序博客网 时间:2024/05/23 02:00
转自:http://www.wenwn.com/?p=477
方法一:如果是偶数则向右移动一位,如果是奇数就判断一下+1还是-1次数少.【动态规划】
int operation1(int num) { int i;int f[num+1];memset(f, 0, sizeof(f));for( i = 2; i <= num; i++) {if( (i&0x1) == 0) {f[i] = 1+f[i>>1];} else {int a = f[(i-1)>>1]+2;int b = 2+ f[(i+1) >>1];[i] = a > b? b:a;}}return f[num];}
时间复杂度为o(n);该算法要每个数都要算一次,然后迭代。
1 当num末尾一位为0,理所当然选择右移一位;
2 当num末尾位为1, xx101和xx001时,对于第一种情况,选择+1,-1的次数一样,对于后者则选择-1。所以对于01的情况,选择-1
3 当num末尾为11, x1011,x0011时, 对于第一种+1,-1一样。对于后者选择+1,所以对于011选择+1;
4 当num末尾为111,10111,00111时,对于第一种选择+1,对于后者选则+1,所以都选择加+1。
num>=3 选择+1
int operation2(int num){int cnt = 0;int tmp = num;while( tmp > 1) {if( (tmp & 0×1) == 0) {cnt++;tmp>>= 1;} else {if( (tmp &0×7) == 0×7) {cnt+=4;tmp +=1;tmp>>=3;} else if( (tmp &0×3 )== 0×3) {cnt+=2;tmp -=1;tmp >>=1;} else if( (tmp &0×1) == 0×1){if( tmp == 0×01) {return cnt;} else {cnt+=2;tmp -=1;tmp >>=1;}}}}return cnt;}
这里的复杂度为num的二进制位数log2(n)
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数:
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- 对一个正整数n,算得到1需要的最少操作次数。
- 对一个正整数n,算得到1需要的最少操作次数
- 实现一个函数,对一个正整数n,算得到1
- 1、对一个正整数算到1需要的最少操作次数
- 算得到1需要的最少操作次数
- 算得到1需要的最少操作次数
- 本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数。
- 正整数n到1的最少操作次数_Glodon(6)_20160923
- 实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数.
- 给定一个十进制正整数N,求出从1开始,到N的所有整数,数字1出现的次数(java实现)
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- 比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
- 输入一个正整数n,计算出1~n之间出现1的次数
- poj 1671 Rhyme Schemes(第二类Stirling数)
- hdu2492 Ping pong 树状数组BIT
- 邮件发送
- Hdu 2063 过山车 最大匹配
- C/C ++程序内存分配详解
- 实现一个函数,对一个正整数n,算得到1需要的最少操作次数?
- PostgreSQL TPC-H测试
- 【学习笔记】JavaScript(2013-10-06)
- POj 3041 Asteroids 最小点覆盖
- 常量折叠 Constant folding
- 递归和非递归方法打印螺旋矩阵
- 通过WifiManager,DhcpInfo获取android IP地址及网关等信息(两种方式)
- A BIG CHALLENGE
- CMPP协议发送超长短信息