求N!的二进制表示中最低位1的位置。
最笨的莫过于对N!直接移位了,然后找到1的位置。
#include<iostream>
using namespace std;
const int N=6;
int Factorial(int N)
{
if(N>1)
{
return N*Factorial( N-1);
}
if(N==1)return 1;
}
int main()
{
int data=Factorial(2);
int loc=0;
while( !(data&0x0001))
{
loc++;
data>>=1;
}
cout<< loc;
return 0;
}11
搞了半天阶乘的程序都搞不清了,智商啊!
书上提供的思路:N=3。N!=2^k*m,m为不含因子2的整数,最低位1的位置=k+1.我们可以这样理解:N!相当于m向左移动的次数,这个次数就是k,因为向左移动就相当于乘法。因此只要计算出从1至N的各个数中因子2 的个数之和。
代码
int lowwstOne(int N)
{
int Ret=0;
while(N)
{
N>>=1;
Ret+=N;
}
return Ret;
}
题二:给定一个数,那么N的阶乘N!末尾有多少个0呢?例如 N=10,N!=3628800;,N!的末尾有俩个0;
上代码 :
ret=0;
for(i=1;i<=N;i++)
{
j=i;
while(j%5==0)
{
ret++;
j/=5;
}
}
求1,2,...N-1,N中因子5的个数。因为10=2*5,所以0 的个数就是10的个数,但是因子2的个数肯定多余5,故求出5的个数就可以了。
这两道理感觉数学技巧性太多,没什么学习价值,搞技术的应该更多学习技术上的技巧性,而非玩弄数学。