《基础学习》之阶乘后面0的个数

参考:https://www.cnblogs.com/hutonm/p/5624996.html

问题描述:

          给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。

计算公式:

         f(x):表示整数阶乘末尾含有的0.

         ,k取整

问题分析:

        然而构成0结尾的必然是因子5*因子2,在自然数序列中,含因子2的个数必然比含因子5的个数(如果你说1->1,3->3,这样举例就没法说了)。

        根据上面我们知道,含有因子5的个数就对应后面0的个数,现在我们来计算因子5的个数

        当n<5时,f(n!) = 0成立

        当n>=5时,我们令  n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4), 

       a=\prod_{i=0}^{k}r_{i},必然a是一个不含因子5的整数。化简上面的公式 n! = [ 5^k * k! ] * a ,因为我们计算的是末尾0,

      所以f(n!) = k + f(k!) ,成立

扫描二维码关注公众号,回复: 3446932 查看本文章

举个例子:

      f(5!) = 1 + f(1!) = 1;

      f(10!) = 2 + f(2!) = 2;

      f(100!) = 20 + f(20!) = 20 + 4 + f(4!) = 24;

      f(1000!) = 200 + f(200!) = 200 + 40 + f(40!) = 200 + 40 + 8 + f(8!) = 200 + 40 + 8 + 1 + f(1!) = 249;

代码:

#include<bits/stdc++.h>
 
using namespace std;

int countZero(int x)
{
    int res=0;
    while(x>=5)
    {
        x/=5;
        res+=x;
    }
    return res;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        printf("%d\n",countZero(n));
    }
    return 0;
}

例题:

链接:https://www.nowcoder.com/acm/contest/135/D

题目描述

输入描述:

输入数据共一行,一个正整数n,意义如“问题描述”。

输出描述:

输出一行描述答案:

一个正整数k,表示S的末尾有k个0

示例1

输入

10

输出

7

AC代码:

/*
思路:间隔5个循环,不会超时

*/

#include<bits/stdc++.h>

using namespace std;

long long countZero(long long x){
    long long res=0;
    while(x>=5){
        x/=5;
        res+=x;
    }
    return res;
}
int main(){
    long long  n;
    scanf("%lld",&n);
    long long x=n/5;
    long long sum=0;
    for(long long i=0;i<x;i++){
    	sum+=5*countZero(i*5);
	}
	sum+=((n%5)+1)*countZero(n);
    printf("%lld\n",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Rvelamen/article/details/81163264
今日推荐