这题略带一些技巧。注意有5因子的数的处理。可以发现乘一个5与乘一个8的效果相同。于是我们对于每一个含有5因子的数在乘的时候做一下处理即可~
#include<iostream>
using namespace std;
const int N = 101;
const int a[10] = {1,1,2,6,4,4,4,8,4,6};
int Positive(int n[N]);
void DivideFive(int n[N]);
int main()
{
int n[N],pos,result,bit;
char s[N],*p;
while(cin>>s)
{
for(p=s;*p!='\0';p++);
for(pos=0;p>s;pos++) n[pos] = *--p - '0';
for(;pos<N;pos++) n[pos] = 0;
for(result=1,bit=0;Positive(n);bit++,DivideFive(n))
result = (result * a[n[0]] * (1 << ( (n[0]%5 * 3 * (bit%4)) % 4))) % 10;
cout<<result<<endl;
}
return 0;
}
int Positive(int n[N])
{
for(int i=N-1;i>=0;i--)
if(n[i]) return 1;
return 0;
}
void DivideFive(int n[N])
{
int m[N];
int mem = 0,pos = N-1;
for(;pos>=0;pos--)
{
mem = mem*10 + n[pos];
m[pos] = mem/5;
mem %= 5;
}
for(pos=0;pos<N;pos++)
n[pos] = m[pos];
}
using namespace std;
const int N = 101;
const int a[10] = {1,1,2,6,4,4,4,8,4,6};
int Positive(int n[N]);
void DivideFive(int n[N]);
int main()
{
int n[N],pos,result,bit;
char s[N],*p;
while(cin>>s)
{
for(p=s;*p!='\0';p++);
for(pos=0;p>s;pos++) n[pos] = *--p - '0';
for(;pos<N;pos++) n[pos] = 0;
for(result=1,bit=0;Positive(n);bit++,DivideFive(n))
result = (result * a[n[0]] * (1 << ( (n[0]%5 * 3 * (bit%4)) % 4))) % 10;
cout<<result<<endl;
}
return 0;
}
int Positive(int n[N])
{
for(int i=N-1;i>=0;i--)
if(n[i]) return 1;
return 0;
}
void DivideFive(int n[N])
{
int m[N];
int mem = 0,pos = N-1;
for(;pos>=0;pos--)
{
mem = mem*10 + n[pos];
m[pos] = mem/5;
mem %= 5;
}
for(pos=0;pos<N;pos++)
n[pos] = m[pos];
}