求N!的二进制表示中最低位1的位置。
最笨的莫过于对N!直接移位了,然后找到1的位置。
[cpp]
view plain
copy
print
?
- #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
[cpp]
view plain
copy
print
?
搞了半天阶乘的程序都搞不清了,智商啊!
书上提供的思路:N=3。N!=2^k*m,m为不含因子2的整数,最低位1的位置=k+1.我们可以这样理解:N!相当于m向左移动的次数,这个次数就是k,因为向左移动就相当于乘法。因此只要计算出从1至N的各个数中因子2 的个数之和。
代码
[cpp]
view plain
copy
print
?
- int lowwstOne(int N)
- {
- int Ret=0;
- while(N)
- {
- N>>=1;
- Ret+=N;
- }
- return Ret;
- }
题二:给定一个数,那么N的阶乘N!末尾有多少个0呢?例如 N=10,N!=3628800;,N!的末尾有俩个0;
上代码 :
[cpp]
view plain
copy
print
?
- 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的个数就可以了。
这两道理感觉数学技巧性太多,没什么学习价值,搞技术的应该更多学习技术上的技巧性,而非玩弄数学