链接:https://ac.nowcoder.com/acm/contest/321/D
来源:牛客网
题目描述
题目太长,简写一下。
首先有一个数字x=1.
然后给了两种操作 x加一 或x乘2
然后输入一个n,问经过最少多少次操作可以有x变成n.
输入描述:
题目包含多组测试数据,请处理到文件结束。每组输入一行表示一个n(1<=N<=10^9),代表最终的钱数。
输出描述:
对于每个输入,输出一个数字代表从1到n需要多少次操作
样例
输入
2
3
输出
1
2
题解
从1变成n需要多少次操作,首先想到了bfs,但是bfs是O(n)的算法,1<=N<=10^9,bfs会超时并且超内存。
然后换一种思路。算n到1需要进行多少次操作,每次n可以减一或者除以2.
由n变成1 每次除以2肯定是最快的。但是n是奇数的时候不能除以2,只能减一。然后模拟一下就行了
比如 100——>1的步骤:
100->50->25->24->12->6->3->2->1 一共就行了8次操作。
当时通过写出n的二进制然后观察规律想出来的。
比如 100——>1的步骤:
100的二进制是1100100
1100100->110010->11001->11000->1100->110->11->10->1
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int main(){
int t;
int a;
while(scanf("%d",&a)!=EOF){
int ans=0;
while(a!=1){
ans++;
if(a&1){ //a是奇数
a--;
}else{
a>>=1;
}
}
printf("%d\n",ans);
}
return 0;
}