题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。
输入输出格式
输入格式:
仅一行包含一个正整数N。
输出格式:
单独一行包含一个整数表示最右边的非零位的值。
输入输出样例
说明
USACO Training Section 3.2
解:
期望:100 实际:29
思路对了,但是忽略了精度问题
对于每次乘,结果至于最后的一位非0数有关,
但若是只保留一位,会出现丢失答案的情况
例子:
14!=87178291200。到这里我们的程序依然正确。result存贮的是2。
15!=1307674368000。然而,2*15=30,去0后是3而非正确的8。
事实上,我们存贮的应是12,12*15=180,去0后是18,个位是正确的8。
所以多保留几位,然后暴力乘即可
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define ll long long 6 using namespace std; 7 inline int read() 8 { 9 int x=0,w=1;char ch=getchar(); 10 while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} 11 while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar(); 12 return x*w; 13 } 14 int n; 15 ll ans; 16 int main() 17 { 18 n=read();ans=1; 19 for(int i=2;i<=n;++i) 20 { 21 ans=ans*i; 22 while(ans%10==0) ans/=10; 23 ans=ans%10000000; 24 } 25 cout<<ans%10; 26 return 0; 27 }