Factorials 3.2

求阶乘的最后一位非零整数。开始天真无鞋,以为只取最后非零位累成即可.然后自然出错

官方解释,可能存在xx12*xxx5,如果只取最后非零位累乘...2*5=10 mode 10 ==1 ,这样两个数十位上的就被忽略了...

大概是这个意思。然后解题思路是,10全部是由2*5产生的,即使是10本身也是2*5,所以只要去掉累乘中的所有2,5对就好了

而2出现的概率远大于5,用数组arry[n]保存1到n,然后每个数mod5 直到因子5全部被剔除 ,同时记录剔除的个数m,

然后再对更新后的arry[n]剔除m个2(记住除多除少了)这样就不会产生10了.

在取最后一位累乘即可. 看似简单,本菜真想不出来了

 1 /*
 2 
 3 ID: hubiao cave
 4 
 5 PROG: fact4
 6 
 7 LANG: C++
 8 
 9 */
10 
11 
12 
13 
14 #include<iostream>
15 
16 #include<fstream>
17 
18 #include<string>
19 
20 using namespace std;
21 
22 
23 
24 int main()
25 
26 {
27 
28     ifstream fin("fact4.in");
29     ofstream fout("fact4.out");
30 
31     int m[4300];
32     int n,time=0;
33     int ans=1;
34     fin>>n;
35 
36     for(int i=1;i<=n;i++)
37     {
38         m[i]=i;
39         while(m[i]%5==0)
40         {
41             time++;
42             m[i]/=5;
43         }
44     }
45     
46     for(int i=1;i<=n;i++)
47     {
48         while(m[i]%2==0&&time>0)
49         {
50             m[i]/=2;
51             time--;
52         }
53     }
54 
55     for(int i=1;i<=n;i++)
56         ans=ans*m[i]%10;
57     fout<<ans<<endl;
58     return 0;
59 
60 
61 }

 

 

 

 

posted @ 2013-09-28 22:16  cavehubiao  阅读(219)  评论(0编辑  收藏  举报