牛客小白月赛5 D -阶乘

链接:https://www.nowcoder.com/acm/contest/135/D
来源:牛客网
 

题目描述

输入描述:

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

输出描述:

输出一行描述答案:

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

示例1

输入

复制

10

输出

复制

7

说明

 

  鸣谢真·dalao Tyxao

题意:如上

思路: 先了解一下n!的结尾0的情况,

应为阶乘结尾为0,为必然有5*2,而有多少0就有多少5对应,比如5!= 1*2*3*4*5=60

10!= 3628800  15!=1307674368000 ,(此时15!已经爆int了,所以如果你想算直接暴力一个大数的阶乘的结尾0,数很难实现的)

5的为1, 10的为2, 15的为3,20的为4, 25的为6,30为7

因此可以根据这个特性来得到单个n的阶乘的结尾0,

ull get0(ull n) {
    ull res = 0;
    while (n >= 5) {
        n /= 5;
        res += n;
    }
    return res;
}

而多个不同的n想乘的化,因为0-4,5-9,10-14,15-19都是相同的,所以可以利用利用个特性来求解

    ull n;
    cin >> n;
    long double ans = 0;//long double 可以完成unsigned long long 内任意两个整数相乘,很好用
    ull i;
    for (i = 5; i + 5 <= n; i += 5) {
        ans += 5 * get0(i);
    }
    ans += (n - i + 1) * get0(n);
    cout.precision(0);//long double 的小数位数为0
    cout << fixed << ans << endl;//fixed去除科学记数法

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/81159936
今日推荐