链接: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去除科学记数法