求1*2*3*……*N所得数末尾有多少个0

n(1<=n<=2^(31))。所以说,暴力的方法就别想了,这很明显就是个数学问题,要我们去发现数学规律。

要出现0,就需要有2和5,当然10也可以,不过10肯定也能因式分解为2和5,所以也就可以看做2和5。我们的最终目的就是寻找这个1-N这些数中能找到多少对2和5,有多少对2和5就有多少个0。在0-N的数中,我们假设对每一个数进行分解,都尝试去分解成2和5。当然不是所有的数都可以分解成2和5,但是最终分解出来的结果2的数量肯定是多于5的数量的,这一点其实很容易想通,二的倍数实在是太多了。最终我们的目的就是求0-N这些数中能分解出多少个5,那么能分解出多少个呢?假设现在的N是100,能分解出多少个5呢?0-100的这些数中有多少个能分解出5的数,有20个怎么知道的呢,0加20个5才能加到100,所以就有20个,然后对这20个数除5,也就是把分解的5拆分出来,看哪些数还能再进行拆分,最终就能得到答案。

 

代码实现:

#include
#include
#define ll  long long

int main(){
    ll n;
    scanf("%lld",&n);
    int res = 0;
    while(n>=5){
        n /= 5;
        res += n;
    }
    printf("%d",res);
    return 0;
}

 

你可能感兴趣的:(算法)