题解 | #小q的数列#

小q的数列

https://www.nowcoder.com/practice/76796815518f4db5b800775581cda1e4

看到题解区写的不够好理解来补充一下

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<t;i++)
    {
        scanf("%ld",&n);
        while(n)//以下对n的操作都为对其二进制形式的操作(位操作)
        {   int count=0;   //count为n的二进制数中1出现的次数
            count+=(n&1)==1?1:0;//& 按位与,二进制两数同一位数上的数都为1则结果为真
            n>>=1;//n=n>>1 二进制n右移一位(低位舍弃,高位补符号位(正数为0)),达到逐位判断的效果
        }
        printf("%d %ld\n",count,(long)pow(2,count)-1);
                                  //等比数列求和公式
        count=0;//重置计数器
    }
    return 0;
}

把思路写下来了,第一次接触这类题感觉还是挺难的,最后求n'那里看了半天才发现是等比数列求和公式推来的

全部评论

相关推荐

点赞 评论 收藏
分享
牛客52071342...:不同的岗位,你得把不对口的内容删掉一些,优化一下,人家公司不管你有多少技能,他只看对他有用的技能,你得根据公司的需求简化简历
那些拿到大厂offer的...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务