侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】阶乘尾零

Allen Best
2022-10-14 / 0 评论 / 0 点赞 / 24 阅读 / 584 字
温馨提示:
本文最后更新于 2023-04-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目描述
给定一个整数 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 , 5
2, 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;
}
0

评论区