size_t foo( size_t n ) // 求n!分解质因子中5的数目 ==
求n!尾部零数字位数目
{
size_t m = 0;
for( ; n!=0; n/=5, m+=n );
return m;
}
size_t bar( size_t n ) // 求n!尾部第一个非零数字
{
size_t m = 1;
size_t k = 0;
for( size_t i=n; i>1; --i )
{
size_t t = i;
for( ; t%5==0; ++k, t/=5 );
for( ; k!=0 && t%2==0; --k, t/=2 );
m = ( m * t ) % 10;
}
return m;
}
#include <stdio.h>
int main( void )
{
const size_t N = 27;
printf(
"%u!尾部有连续%u个0,尾部第一个非零数字为%u.\n", N,
foo(N), bar(N) );
return 0;
}
---