博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
输入一个无符号整数,用最少的步骤将该数变为1
阅读量:6955 次
发布时间:2019-06-27

本文共 1266 字,大约阅读时间需要 4 分钟。

输入一个无符号整数n,用最少的步骤将该数变为1,当n为偶数时能够採取的步骤是除2的形式,当n为奇数的时候能够採取加1或者减1的操作。

#include 
#include
using namespace std;int min(int a, int b) { if (a < b) return a; return b;}int get_pow(uint num) { if (num <= 1) return 0; int power = 0; while (0 == (num % 2)) { power++; num /= 2; } return power;}int get_step(uint num) { if (1 >= num) return 1; int step = 0; while (num > 1) { if (0 == (num % 2)) { step++; num /= 2; } else { int plus_pow = get_pow(num + 1); printf("num=%d, plus_pow=%d\n", num, plus_pow); int minus_pow = get_pow(num - 1); printf("num=%d, minus_pow=%d\n", num, minus_pow); if (1 == plus_pow && 1 == minus_pow) { step += 1 + min(get_step(num - 1), get_step(num + 1)); return step; } else if (plus_pow > minus_pow) { step += 1 + plus_pow; num = (num + 1) / ((int)pow(2.0, plus_pow)); } else if (plus_pow < minus_pow) { step += 1 + minus_pow; num = (num - 1) / ((int)pow(2.0, minus_pow)); } } if (3 == num) { step += 2; num = 1; } } if (0 == num) step += 1; return step;}int main(int argc, char* argv[]) { int num = 0; cin >> num; int step = get_step(num); cout << "step:" << step << endl; return 0;}
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5139968.html,如需转载请自行联系原作者
你可能感兴趣的文章
翻翻git之---RecycleView的上拉,下拉刷新,样式切换,添加foot和header的强大库 RecyclerViewManager...
查看>>
Hive事物和锁管理
查看>>
curd库
查看>>
CODELF 发布了贴心小功能 - 算法字帖
查看>>
从IP数据包到端口发送究竟经历了什么?
查看>>
前端小白入门区块链系列04
查看>>
ShineButton-一个动效的按钮
查看>>
Java并发编程-锁及并发容器
查看>>
我怕了还不行嘛!
查看>>
element-UI change 事件传递自定义参数
查看>>
logback解析——Appender
查看>>
字符串、列表、字典
查看>>
Function 与 Classes 组件的区别在哪?
查看>>
jenkins 动态 slave
查看>>
[杭州/新加坡] imToken 招聘前端工程师
查看>>
Flutter视图基础简介--Widget、Element、RenderObject
查看>>
iview·select动态渲染后显示内容与选中不一致
查看>>
数据结构学习笔记--栈
查看>>
redis安装
查看>>
C语言求1+2!+3!+...+20!的和 的代码
查看>>