Description
N 的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是 找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以 最后面的非零位是4。
Input
共一行,一个整数不大于4,220的整数N。
Output
共一行,输出N!最后面的非零位。
Sample Input
7
Sample Output
4
解题思路:这道题思路倒是很简单,我们首先要知道N!的最后一位非零数是怎么得到的,我开始以为它是由1~N各项逐项相乘的最后一位非零数贡献得到的,所有开始遍历的时候对每次相乘得到的结果取最后一位非零数保存继承给下一次的相乘,一直循环下去,但是很不幸的是答案错误,后来我想到了这样一种情况,假设24*25,要是按照我之前的理解,答案是4*25 = 100,也就是1,但是24*25=600,答案应该是6!!!所以为了避免出现这种进位情况的出现,我们需要保存尽量多的后几位,这里最大是4220,所以对10000求余即可,存在后导零时消去。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define ll long long int 5 using namespace std; 6 int main() 7 { 8 ll n,i; 9 ll ans; 10 ans=1; 11 scanf("%lld",&n); 12 for(i=1;i<=n;i++) 13 { 14 ans=ans*i; 15 while(ans%10==0) 16 { 17 ans=ans/10; 18 } 19 if(ans>10000) 20 { 21 ans=ans%10000; 22 } 23 } 24 ans=ans%10; 25 printf("%lld ",ans); 26 return 0; 27 }