说明:相当于求 N!的二进制表示最后有几个0 (与上篇中求N!十进制表示 最后有几个0 相似)
即求 N!的质因子2的个数 == [N/2]+[N/2^2]+[N/2^3]+....
然后+1就是得到位置了。(PS:位置从1开始算)
求 N!的质因子2的个数的另一个方法:
N!含有质因数2的个数,等于N减去N的二进制表示中1的个数
#include <stdio.h>
#include <stdlib.h>
//太大的话会溢出的,只能算12!以下。测试用。
unsigned int factorial(unsigned int n)
{
if(n==0 || n==1) return 1;
else
return n*factorial(n-1);
}
//打印二进制表示
void pr_binary(unsigned int n)
{
if(n==0) return;
pr_binary(n>>1);
printf("%d",1&n);
}
//N!质因子2的个数==[N/2]+[N/2^2]+[N/2^3]+...
unsigned int numInfactorBase2(unsigned int n)
{
unsigned int count = 0;
while (n)
{
n /= 2;
count += n;
}
return count;
}
//求 二进制中1的个数
unsigned int numof1(unsigned int n)
{
int count=0;
while(n)
{
++count;
n&=(n-1);
}
return count;
}
//N!含有质因数2的个数,还等于N减去N的二进制表示中1的个数
unsigned int numInfactorBase2_s(unsigned int n)
{
return n-numof1(n);
}
int main(void) {
int N=10;
printf("%d! == %d\n",N,factorial(N));
printf("in binary:");
pr_binary(factorial(N));
printf("\n");
printf("number of 1 in binary %d!:%d\n",N,numof1(factorial(N)));
printf("index:%d\n",numInfactorBase2(N)+1);
printf("index:%d\n",numInfactorBase2_s(N)+1);
return 0;
}
/*
10! == 3628800
in binary:1101110101111100000000
number of 1 in binary 10!:11
index:9
index:9
*/