题目大意
求阶乘 n n n的最后一位非零数.
题目分析
可以发现,最后一位非零数一定是 2 , 4 , 6 , 8 {2,4,6,8} 2,4,6,8中的某一个数.
所以可以写个随机数生成器交上去
那我们不妨考虑什么情况下会产生后导 0 0 0:
2 ∗ 5 = 10 2*5=10 2∗5=10
显然 2 2 2的个数比 5 5 5的个数多,那我们就可以对每个数,分解出它所含的 2 2 2和 5 5 5,再拿剩下的去乘和模;计算的冗余 2 2 2在最后再一起乘上.
程序实现
#include<bits/stdc++.h>
using namespace std;
int n,ans=1,s;
int operate(int k){
int t=k;
while(t%2==0){
t/=2;
s++;
}
while(t%5==0){
t/=5;
s--;
}
return t;
}
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++)
ans=(ans*operate(i))%10;//除了2和5剩下的数都不会将最后一位变成0
for(int i=1;i<=s;i++)ans=(ans*2)%10;
printf("%d\n",ans);
return 0;
}
题后总结
1.
1.
1. 对于分解质因数的方法还不够熟悉,导致想不到.
2.
2.
2. 没有想清楚要处理的问题(0的处理),导致切入点不对,找不到规律.