poj 1604 Just the Facts

#include <iostream>            //计算 n!的最后一位非零位,时间复杂度为0(logn)
#include <cmath>

using namespace std;
int fac[10];
int get2(int n)
{
if(n==0)
return 0;
return n/2+get2(n/2);
}
int get5(int n)
{
if(n==0)
return 0;
return n/5+get5(n/5);
}
int g(int n,int x)
{
if(n==0)
return 0;
return n/10+(n%10>=x)+g(n/5,x);
}
int getx(int n,int x)
{
if(n==0)
return 0;
return getx(n/2,x)+g(n,x);
}
int main()
{
int n;
while(cin>>n)
{
fac[2]=get2(n); // fac[2]肯定大于fac[5]
fac[5]=get5(n);

fac[3]=getx(n,3);
fac[7]=getx(n,7);
fac[9]=getx(n,9);
int t=fac[2]-fac[5]; // t 表示因子2跟5合并后剩下的2的数量
while(t>=5) // 2^5 % 10 = 2 ,所以 5 是循环周期
{

t=t/5+t%5;
}
fac[3]%=4;fac[7]%=4;fac[9]%=4; // 3^4 % 10 = 1 , 7^4 % 10 = 1 , 9^4 % 10 = 1
printf("%5d -> %d\n",n, int( pow(2.0,t) * pow(3.0,fac[3]) * pow(7.0,fac[7]) * pow(9.0,fac[9]) ) % 10 );

}
return 0;
}

posted on 2011-07-22 16:29  sysu_mjc  阅读(144)  评论(0编辑  收藏  举报

导航