poj 1604 Just the Facts

 1 /**
 2 大意: 求n! 结果 从左到右 第一个非零数
 3 跟 1150 差不多。。
 4 **/
 5 #include <iostream>
 6 #include <cstdio>
 7 using namespace std;
 8 
 9 int s[][4]={
10     {6,2,4,8},{1,3,9,7},{1,7,9,3},{1,9,1,9}
11             };
12 int get2(int n){
13     if(n==0)
14         return 0;
15     return n/2+get2(n/2);
16 }
17 
18 int get5(int n){
19     if(n==0)
20         return 0;
21     return n/5+get5(n/5);
22 }
23 
24 int get(int n,int x){
25     if(n==0)
26         return 0;
27     return n/10+(n%10>=x)+get(n/5,x);
28 }
29 
30 int getx(int n,int x){
31     if(n==0)
32         return 0;
33     int res =0;
34     res = getx(n/2,x)+get(n,x);
35     return res;
36 }
37 
38 int main()
39 {
40     int n;
41     while(cin>>n){
42         int num2 = get2(n);
43         int num5 = get5(n);
44         int num3 = getx(n,3);
45         int num7 = getx(n,7);
46         int num9 = getx(n,9);
47         if(num2<num5){
48             printf("%5d -> %d\n",n,5);
49             continue;
50         }else{
51             int res =1;
52             if(num2!=num5){
53                 num2 = num2-num5;
54                 res  = res*s[0][num2%4];
55                 res = res%10;
56             }
57             res *= s[1][num3%4];
58             res %=10;
59             res *= s[2][num7%4];
60             res %=10;
61             res *= s[3][num9%4];
62             res = res%10;
63             printf("%5d -> %d\n",n,res);
64         }
65     }
66     return 0;
67 }

 

posted @ 2014-05-12 20:43  夜晓楼  阅读(207)  评论(0编辑  收藏  举报