将[1, n]从中间分成[1, n/2] 和[n/2+1, n]两个部分,分别包含n/2和(n+1)/2个数,将第二部分的数分别减去n/2+1, 第二部分变为[0, (n-1)/2], 第一部分包括第二部分,可得递推公式为:f(n) = f(n/2) + 1; 代码如下:
View Code
1 #include <cstdio> 2 3 int f(int n) 4 { 5 return n == 1 ? 1 : f(n/2)+1; 6 } 7 8 int main() 9 { 10 int n; 11 while(scanf("%d", &n) != EOF) 12 printf("%d\n", f(n)); 13 return 0; 14 }