题目:给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数
例如 5!= 120 即输出 1
10! = 3628800 即输出 2
。。。。。。
思路:对于数字问题我个人喜欢优先考虑使用动态规划去分析,万一找到规律的了呢 ๑乛◡乛๑
毕竟这种问题脑补思路写出来的代码肯定要进行时间复杂度的优化 _(:з」∠)_
分析: 1! = 1 =>0 2!= 2 =>0 3!= 6 =>0 4!= 24 =>0 5!= 120 =>1
由 2—5的阶乘 我发现只有5的阶乘出现了0 那是不是意味着阶乘尾数0只和5有关呢?(..•˘_˘•..)
于是就是测试下10! 15!20!
10!= 3628800 => 2 15!= 1307674368000 =>3 20!= 2432902008176640000 =>4
我发现好像真的有那么点道理哦? 可是如果真的只是算5的话这题目是不是太简单了呢?于是我还是多找几组数据来测试一下吧
25!= 15511210043330985984000000 =>6 (¬_¬) 果然不是这么简单就能算出来的 到这里突然从 4 变成了 6
想去看看30的阶乘 发现已经超出计算机显示范围了 2.6525285981219105863630848e+32
于是就只能这样打表了:
5 => 1 10 => 2 15 => 3 20 => 4 25 => 6
找规律:
5/5 = 1 1/5 = 0 => 1+0 = 1
10/5 = 2 2/5 = 0 => 2+0 = 2
15/5 = 3 3/5 = 0 => 3+0 = 3
25/5 = 5 5/5 = 1 => 5+1 = 6
好像就是这么回事哎? ≖‿≖✧
所以 n! 的尾数0 就是 不断累加 n/5 直到 n=0为止 最后附上代码
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int sum = 0;
while(n){
sum += n/5;
n /= 5;
}
cout<<sum;
return 0;
}