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 }