阶乘问题
题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!= 1 \times 2 \times 3 \times 4 \times 5 \times 6 \times 7 \times 8 \times 9 \times 10 \times 11 \times 12 = 479,001,60012!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
1212 的阶乘最右边的非零位为 66 。
写一个程序,计算 N(1 \le N \le 50,000,000)N(1≤N≤50,000,000) 阶乘的最右边的非零位的值。
注意: 10,000,000!10,000,000! 有 24999992499999 个零。
输入输出格式
输入格式:
仅一行包含一个正整数 NN 。
输出格式:
一个整数,表示最右边的非零位的值。
输入输出样例
说明
USACO Training Section 3.2
分析:
其实真的很简单。因为只要求最右边的非零位,那么就从2~n一次遍历(因为1不用乘),每次乘之前,先判断如果是10的倍数就除以10,直到它不是10的倍数,乘完以后对结果进行同样的判断。为了防止结果过大,可以每次对一个特别大的数取模(如果取模的数过小,可能会使结果出现误差,易证)。最后把结果模10输出即可。
Code:
1 //It is made by HolseLee on 1st June 2018 2 //Luogu.org P1134 3 #include<bits/stdc++.h> 4 using namespace std; 5 typedef long long ll; 6 ll n,ans=1; 7 int main() 8 { 9 cin>>n; 10 for(ll i=2;i<=n;i++){ 11 ll ka=i; 12 while(ka%10==0){ka/=10;} 13 ans=ans*ka; 14 while(ans%10==0){ans/=10;} 15 ans=ans%100000000;} 16 cout<<ans%10; return 0; 17 }