题目描述
给定一个整数 n,n 的阶乘定义为
n!=1×2×⋯×n
请计算在 n! 的十进制表示中,末尾有多少个连续的 0?
例如 n=5,则 n!=120,末尾有 1 个 0,又12!=479001600,末尾有 2 个 0。
输入格式
单个整数表示 n。
输出格式
单个整数表示 n! 中末尾零的个数。
数据范围
对于 30% 的数据,1≤n≤1000;
对于 60% 的数据,1≤n≤1,000,000;
对于 100% 的数据,1≤n≤2,000,000,000;
【题解】
N的阶乘一定可以用K×10M来表示,那我们的问题就变成了求M。
又因为10 只能分解成 2 * 5,所以只需要求出 2 的个数和 5 的个数中的最小值,就得到了M。
而任何数因数分解后,2 的个数 一定多于 5 的个数(因为2的倍数比5的倍数多),所以 这个题最后又变成 了求 5 的个数。
随着数字的增加,能提取出来的 5 的个数越来越多,循环次数会增加,为了减少循环次数,我们可以提取5 , 52, 5^3 ……可以提高效率5 的个数 Y 可得到公式:
Y = [N/5] + [N/(5^2)] + [N/(5^3)] + …
代码实现
#include <iostream>
using namespace std;
int main()
{
long long n,num=0;
cin>>n;
while(n!=0){
num+=n/5;
n/=5;
}
cout<<num<<endl;
return 0;
}
评论区