NYOJ954--N的阶乘的二进制表示最低位的1的位置

这个题和51nod1003 原理差不多

51nod1003

都是关于阶乘的一些技巧

题目:

原理:

二进制数

乘上2 末尾会多一个0  再乘一个二 末尾会再多一个0   也就是乘上2^2(2的平方)末尾会多两个0

以此类推  末尾有多少0  怎么算

这个数  的因子中2出现的次数 就是末尾0的个数  

而求一个数字n的阶乘中某个因子出现的次数  我们的方法之前说过

我们用n累除这个数  得到的数累加  就是次数

(注意 这个方法 适用条件 我们要求的数字是n的阶乘    此时我们利用n 就可以求得次数  不用算出n!

代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main(){
    int n;
    while(~scanf("%d",&n)){
        int cnt=0;
        while(n){
            n/=2;
            cnt+=n;
        }
        printf("%d\n",cnt+1);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/83934544
今日推荐