1:求二进制中1的个数
下面是通过移位法来实现的,要先考虑第一位,每次取最右边一位,与0X01进行与操作,若是结果为1,则该位置数字为1,再将数字右移一位,再进行比较该位是否为1.
<span style="font-size:18px;">#include <iostream>
#include <windows.h>
using namespace std;
int Count1(BYTE v)
{
int num=0;
while(v)
{
num += v & 0x01;
v>>=1;
}
return num;
}
void main()
{
BYTE v=11100110;
cout<<Count1(v);
}</span>
当输入的是int型的数字时呢?
<span style="font-size:18px;">#include <iostream>
using namespace std;
int findNumOf1(int k)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (k & flag)
{
count++;
}
flag = flag<<1;
}
return count;
}
int main()
{
int val = 0; int ret;
//cin>>val;
val=11;
ret = findNumOf1(val);
cout<<ret;
return 0;
}
</span>
2:
求N!中末尾0的个数:
<span style="font-size:18px;">#include <iostream>
#include <fstream>
using namespace std;
//计算N阶乘末尾0的个数。
//该问题等价于N阶乘的结果中因式分解中5的指数
void main()
{
int ret=0;
int j;
for(int i=1;i<=100; i++)
{
j =i;
while(j%5==0)
{
ret++;
j /= 5;//对于作为5的指数次的数,贡献是多次的
}
}
}</span>
另外一种方法:
<span style="font-size:18px;">#include <iostream>
#include <fstream>
using namespace std;
//计算N阶乘末尾0的个数。
//该问题等价于N阶乘的结果中因式分解中5的指数
void main()
{
int ret=0;
int N=100;
while(N)
{
ret += N/5;
N /=5;
}
}</span>
3:求解N!的二进制表示中最低位1的位置
等价于2的质因数的个数+1,则可以用上述的方法。也可以按照位移动的方式:
<span style="font-size:18px;">#include <iostream>
#include <fstream>
using namespace std;
void main()
{
int ret=0;
int N=3;
while(N)
{
N>>=1;
ret+=N;
}
}</span>