标签:
题目1:给定一个整数N,那么N的阶乘N!末尾有几个0呢?ret=0;
for(i=1;i<=N;i++)
{
j=i;
while(j % 5==0)
{
ret++;
j/=5;
}
}由上可看出,循环中有许多不要的步骤,因为只需要求5的指数个数即可,上述还可以改进如下:ret=0;
for(i=1;i<=N;i*=5)
{
j=i;
while(j % 5==0)
{
ret++;
j/=5;
}
}方案二解法如下;Z=[N/5]+[N/5^2]+[N/5^3]+....(公式中[N/5]表示不大于N的数中5的倍数贡献一个)。ret=0;
while(N)
{
ret+=N/5;
N/=5;
}题目2:求N!的二进制中最低位1的位置。int lowestOne(int N)
{
int Ret=0;
while(N)
{
N>>1;
Ret+=N;
}
return Ret+1;
}方案二:这里我们还可以根据N减去N的二进制中1的数目这个规律来求解。int count(int n)//统计1的个数;
{
int Ret=0;
while( n )
{
Ret++;
n= n&(n-1);
}
return Ret;
}
int FindLowestOne(int num)//num中最低位1的位置;
{
return num-count(num)+1;
}相关题目;给定整数n,判断它是否为2的方幂。if(n & (n-1))==0)
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51871692