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

来源:互联网 发布:java线程讲解 编辑:程序博客网 时间:2024/06/05 19:03

一.问题描述:
求N!的二进制表示中最低位1的值
二.问题分析
首先来看一下一个二进制数除以2的计算过程和结果是怎样的。
把一个二进制数除以2,实际过程如下:
判断最后一个二进制位是否为0,若为0,则将二进制数右移一位,即为商值;反之,若为1,则说明这个二进制数是奇数,无法被2整除。
所以,这个问题实际上等同于求N!含有质因数2的个数。即答案等于质因数2的个数加1。
三.解法1
#include<iostream>

using namespace std;

//计算N! 的质因数2的个数
int totalNubelof2(int n)
{
int count=0;
while(n)
{
count+=n/2;
n=n/2;
}
return count;
}
int main()
{
int n,_2total;
int position;
cin>>n;

//最低位1的位置等于_2total+1
position=totalNubelof2(n)+1;
cout<<position<<endl;
return 0;
}


四.解法2
规律:N!含有质因数2的个数,还等于N减去N的二进制表示中1的个数。
源代码实现:
#include<iostream>

using namespace std;


//计算一个整数二进制表示中1的个数
int GetBitNumOfOne(int nValue)
{
nValue = ((0xaaaaaaaa & nValue)>>1) + (0x55555555 & nValue);
nValue = ((0xcccccccc & nValue)>>2) + (0x33333333 & nValue);
nValue = ((0xf0f0f0f0 & nValue)>>4) + (0x0f0f0f0f & nValue);
nValue = ((0xff00ff00 & nValue)>>8) + (0x00ff00ff & nValue);
nValue = ((0xffff0000 & nValue)>>16) + (0x0000ffff & nValue);

return nValue;
}
//计算2的质因数个数
int total_number_2(int n)
{
int count=0;
int m=n;
count=n-GetBitNumOfOne(m);
return count;
}
int main()
{
int n;
int _2total;
cin>>n;
_2total=total_number_2(n);
cout<<_2total+1<<endl;
}

 

原创粉丝点击