看到题解区写的不够好理解来补充一下f[0]=0 f[1]=1;f[i]=f[i/2]+f[i%2];(i>=2)乍看是个递归,但后面还要求f[n]出现第一次,用递归不好解决再仔细观察f[i]的递推公式,可以发现其算法与十进制转二进制的“除2倒取余”类似——这里的f[i]表示i转为二进制数中'1'出现的次数,故可联想到用二进制运算求解本题 #include <stdio.h> #include <math.h> int main() { int t=0; long n=0; scanf("%d",&t); for(int i=0;i<...