刷题之2. 尾部的零

此题是算一个数的阶乘尾部的零的数量。例如5! = 120,输出1。读题后我先想到用取余的方法计算零的方法,代码如下

long sum = 1;
        long j = 10;
        long a = 0;
        for(long i = n; i > 0; i--)
        {
            sum = sum * i;
        }
        while(sum / j > 0)
        {
            if(sum % j == 0)
            {
              a++;
            }
            j = j * 10;
        }

但是当阶乘大了的时候就会出错,因为阶乘计算会出现很大的数,会超过long int的长度。所以此方法适用于求阶乘比较小的数。通过学习,我明白了新方法,阶乘中要出现0,必然是5或者5的平方乘以一个偶数,所以首先要找出给出的阶乘数里有多少个5或5的平方的倍数,例如求210阶乘的0的个数,210 / 5 = 42。有21个5的倍数,但其中可能包括了25,125...等5的平方的倍数,因为8 * 5 = 40,8 * 25 = 200, 8 * 125 = 1000。有一个5,则会产生一个0。所以25,125等5的平方可以产生多个0,所以我们要在刚刚找的5的倍数中找出既是5的倍数又是25倍数的数,所以用42 / 5 = 8。有8个25的倍数,这8个数能产生2个0,所以我们把多出来0加上去。125也是一样,因为125乘以偶数可以产生比25乘以偶数所得的0还多一个,所以我们要在25的倍数里找出既是25倍数又是125的倍数的数,8/125 = 0。有0个,没有125的倍数,所以也没有比125更大的5的次方的倍数,所以210阶乘末尾的0的个数为5的倍数+25的倍数*2。所以42 + 8 = 50。有50个零。此方法代码很简单,想法比较复杂。


猜你喜欢

转载自blog.csdn.net/yan245294305/article/details/79132808
今日推荐