这道题中,阶乘里面每出现一个5,最后的阶乘里面最后就会多一个0(25这样的数字算2个5),所以,所有能够被五整除的数字在做乘法的时候要把数字里面的5全部去掉,每出现一个5就要在偶数里面扣掉一个2形成10,这个10就和我们这道题最后的答案没有关系了,然后利用取模运算的性质:(a*b)%c = ((a%c)*(b%c)) % c 这样阶乘大数越界的问题也就解决了。下面是代码:
#include <stdio.h>
void func(int n)
{
int five_num;
int i, result, t;
five_num = 0;
result = 1;
//统计总共有多少个5出现在阶乘中
for(i=1; i<=n; i++)
{
if(i%5 == 0)
{
t = i;
while(1)
{
if(t%5 != 0)
break;
else
{
t = t/5;
five_num ++;
}
}
}
}
for(i=1; i<=n; i++)
{
if(i%5 == 0)
{
t = i;
while(1)
{
if(t%5 != 0)
break;
else
t = t/5;
}
result = (result * (t%10)) % 10;
continue;
}
if(i%2)
{
result = (result * (i%10)) % 10;
}
else
{
if(five_num)
{
t = i;
while(t%2==0 && five_num)
{
five_num --;
t = t/2;
}
result = (result * (t%10)) % 10;
}
else
{
result = (result * (i%10)) % 10;
}
}
}
printf("%5d -> %d\n", n, result);
}
int main(void)
{
int n;
while(scanf("%d",&n) != EOF)
{
func(n);
}
}