#include<stdio.h>
//一个整数乘以2的效果是这个数像左移一位
//逆向思考,一个偶数的最低位的1在哪个位置就可以转化为这个偶数中2的因子的个数
//num为输入的整数
int lowestOne(int num)
{
if(num== 0 || (num%2==1)) return 0;
int ret = 0;
while( (num & 0x00000002) != 2)
{
num = (num >> 1);
ret += 1;
}
return ret + 1;
}
//n!
int lowestOneFactorial(int n)
{
if(n == 0 || n == 1) return 0;
int ret = 0;
for(int i=2; i<=n; i++)
{
int j = i;
while(j%2==0 && j!=0)
{
ret++;
j = j/2;
}
}
return ret;
}
int factorial(int n)
{
if(n==0 || n==1) return 1;
int ret = 1;
for(int i=2; i<=n; i++)
{
ret *= i;
}
return ret;
}
//暂时还没明白,难道有数学公式???
int getLowestOne(int n)
{
int ret = 0;
while(n)
{
n = n >> 1;
ret += n;
}
return ret;
}
void test()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
int ret = lowestOne(factorial(n));
printf("%d\n", ret);
ret = lowestOneFactorial(n);
printf("%d\n", ret);
ret = getLowestOne(n);
printf("%d\n", ret);
}
}
int main()
{
test();
return 0;
}
http://demon.blog.ustc.edu.cn/
http://demon.blog.ustc.edu.cn/
http://demon.blog.ustc.edu.cn/