参考了NOCOW上面的解释。
这道题利用到因式分解,注意到每一个整数仅有一种因式分解方法,所以如果这个整数是10的倍数的话,那么因子中必然至少有一对2和5。那么如果把N!的因子中所有2和5一对一对地去掉,直到剩下2而没有5时(2总比5多),剩余因子的乘积个位数必然不为0,要求这剩余部分因子乘积的个位可以在对10取模的运算下进行。即为所求。

Code

/**//*
ID: sdjllyh1
PROG: fact4
LANG: JAVA
complete date: 2009/1/17
author: LiuYongHui From GuiZhou University Of China
more articles: www.cnblogs.com/sdjls
*/

import java.io.*;
import java.util.*;

public class fact4


{
private static int n;
private static int product;//保存乘积中最右一位不为零的数
private static int count;//保存2比5多出现的次数

public static void main(String[] args) throws IOException

{
init();
run();
output();
System.exit(0);
}

private static void run()

{
product = 1;
count = 0;
//依次考虑小于n的每一个数
for (int i = 2; i <= n; i++)

{
int num = i;
//计算2出现的次数
while (num % 2 == 0)

{
count++;
num = num >> 1;
}
//计算5出现的次数
while (num % 5 == 0)

{
count--;
num = num / 5;
}
//乘在product中
product = (product * num) % 10;
}
//乘上剩余的2
if (count>0)

{
product = (product * power(count)) % 10;
}
}
//计算2的n次方的个位数
//注意有:2的0、1、2、3……次方的个位分别为2、4、8、6、2、4、8、6……
private static int power(int n)

{
int retPower = 0;
switch (n % 4)

{
case 0:
retPower = 6;
break;
case 1:
retPower = 2;
break;
case 2:
retPower = 4;
break;
case 3:
retPower = 8;
break;
}
return retPower;
}

private static void init() throws IOException

{
BufferedReader f = new BufferedReader(new FileReader("fact4.in"));
n = Integer.parseInt(f.readLine());
f.close();
}

private static void output() throws IOException

{
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("fact4.out")));
out.println(product);
out.close();
}
}
这道题利用到因式分解,注意到每一个整数仅有一种因式分解方法,所以如果这个整数是10的倍数的话,那么因子中必然至少有一对2和5。那么如果把N!的因子中所有2和5一对一对地去掉,直到剩下2而没有5时(2总比5多),剩余因子的乘积个位数必然不为0,要求这剩余部分因子乘积的个位可以在对10取模的运算下进行。即为所求。

/**//*
ID: sdjllyh1
PROG: fact4
LANG: JAVA
complete date: 2009/1/17
author: LiuYongHui From GuiZhou University Of China
more articles: www.cnblogs.com/sdjls
*/
import java.io.*;
import java.util.*;
public class fact4

{
private static int n;
private static int product;//保存乘积中最右一位不为零的数
private static int count;//保存2比5多出现的次数
public static void main(String[] args) throws IOException
{
init();
run();
output();
System.exit(0);
}
private static void run()
{
product = 1;
count = 0;
//依次考虑小于n的每一个数
for (int i = 2; i <= n; i++)
{
int num = i;
//计算2出现的次数
while (num % 2 == 0)
{
count++;
num = num >> 1;
}
//计算5出现的次数
while (num % 5 == 0)
{
count--;
num = num / 5;
}
//乘在product中
product = (product * num) % 10;
}
//乘上剩余的2
if (count>0)
{
product = (product * power(count)) % 10;
}
}
//计算2的n次方的个位数
//注意有:2的0、1、2、3……次方的个位分别为2、4、8、6、2、4、8、6……
private static int power(int n)
{
int retPower = 0;
switch (n % 4)
{
case 0:
retPower = 6;
break;
case 1:
retPower = 2;
break;
case 2:
retPower = 4;
break;
case 3:
retPower = 8;
break;
}
return retPower;
}
private static void init() throws IOException
{
BufferedReader f = new BufferedReader(new FileReader("fact4.in"));
n = Integer.parseInt(f.readLine());
f.close();
}
private static void output() throws IOException
{
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("fact4.out")));
out.println(product);
out.close();
}
}