算法竞赛入门训练指南(蓝书)第26页,思路就是自己挨着试下,总结规律,发现每次都是把后面一半尽量先减去,这样后面的数就会与前一半重复,重复部分等价于没有。所以递推式是f(n) = f(n/2) + 1
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int f(int n) {
if(n==1) {
return 1;
}
return 1+f(n/2);
}
int main() {
int n;
while(scanf("%d",&n) != EOF) {
printf("%d\n",f(n));
}
return 0;
}