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