返回首页 一步一步写算法

n!中末尾零的个数统计

在很多面试的题目中,求n!结果中零的个数也是经常遇到的一道题目。那么这道题目的解决方法究竟是什么呢?我愿意在此和大家分享一下我自己的一些看法,有不同见解的朋友欢迎多提意见。

求n!中零的个数主要在于乘数中有没有能被2和5整除的数,只要能找到被2和5整数的乘数即可,所以,我的代码流程是这样的:

(1)查找当前数据中有没有可以整除2的整数,同时修改整数的数值

(2)查找当前数据中有没有可以整除5的整数,同时修改整数的数值

(3)如果1、2的条件同时满足,表示已经有一个零了,count++

(4)重复1、2的过程,直到1、2中有一个条件为假

说了这么多,那么代码应该怎么书写呢?下面是我个人写的一个例子,欢迎大家写出自己的想法:

int count_zero_number(int value)
{
    int count;
    int index;
    int* pData;
    int flag_two;
    int flag_five;
    if(value <= 0)
        return 0;

    pData = (int*)malloc(sizeof(int) * value);
    assert(NULL != pData);
    memset(pData, 0, sizeof(int) * value);

    for(index = 0; index < value; index ++){
        pData[index] = index + 1;
    }

    count = 0;
    do{
        /* reset the flag value */
        flag_two = 0;
        flag_five = 0;

        for(index = 0; index < value; index ++){
            if( 0 == (pData[index] % 2)){
                pData[index] /= 2;
                flag_two = 1;
                break;
            }
        }

        if(!flag_two)
            break;

        for(index = 0; index < value; index ++){
            if( 0 == (pData[index] % 5)){
                pData[index] /= 5;
                flag_five = 1;
                count ++;
                break;
            }
        }

    }while(flag_five);

    free(pData);
    return count;
}
上一篇: 大数计算 下一篇: 洗牌算法