2012年2月22日星期三

求N!的尾部连续0的个数




求解N!的尾部连续0的个数.
btw,N! 即阶乘表达式,1 * 2 * ... * N 的结果。不好意思是我啰嗦了哈。

以下描述不同解法。

一般解法,解法1,步骤:
a 求解N!阶乘的结果fac;
b 从fac末位开始,依次向前遍历直至非0。

__int64 Factorial(int n)
{
    if(n<0)
        return -1;// error
    if(n<=1)
        return 1;
    //int f0=1, f1=1,
    __int64     f2=1;
    for(int i=2; i<=n; i++) //__int64
        f2 *= i;
    return f2;
}
int FactorialCount0Num_1(int n)
{
    __int64 fac = Factorial(n);
    int count =0;
    while(fac%10==0)
    {
        count++;
        fac /= 10;
    }
    return count;
}

较高效解法,解法2,步骤:
a 遍历[5, n]之间的数值,找出数值为5倍数。
b 累加计算这些数值除以5的结果。
int FactorialCount0Num_2(int n)
{
    int     count =0;
    for (int i=5; i<=n; i+=5)
    {
        int j=i;
        while (j%5==0&&j!=0)
        {
            count++;
            j = j/5;
        }
    }
    return  count;
}


没有评论:

发表评论