求N!的二进制表示中最低位1的位置?

邮差的信 提交于 2020-03-18 08:38:02

解法一:如果n!最末尾位0,则右移一位得到商,如果末尾是1,则不能被2整除,是奇数,这个问题等同与求n!中质有质因数2的个数。。最后结果再加1

代码:

#include<iostream>
using namespace std;
int main()
{
    int n,sum;
    sum=0;
    cin>>n;
    while(n)
    {
        n>>=1;
        sum+=n;
    }
    cout<<sum+1<<endl;
    system("pause");
    return 0;
}

解法二:N减去N的二进制表示中1的数目,然后再加1。。这也是一个规律。。

代码:

#include<iostream>
using namespace std;

int getNum(int n)
{
    if(n==0) return 0;
    int count=0;
    while(n)
    {
        n&=(n-1);
        count++;
    }
    return count;
} 

int main()
{
    int n,sum;
    sum=0;
    cin>>n;
    cout<<n-getNum(n)+1<<endl;
    system("pause");
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!