二进制拆分。
由2^0,2^1,2^2……可以组成小于等于这些二的倍数的和的所有数。
所以直接就水过了,不过我的代码写得比较差喽。
#include<cstdio> int main(){ int n,i=0; scanf("%d",&n); for(;(1<<i)<=n+1;i+=1); i--; if((1<<i)==n+1) printf("%d",i); else printf("%d",i+1); return 0; }