Just the Facts
Time Limit: 2 Seconds Memory Limit: 65536 KB
The expression N!, read as “N factorial,” denotes the product of the first N positive integers, where N is nonnegative. So, for example,
N N!
0 1
1 1
2 2
3 6
4 24
5 120
10 3628800
For this problem, you are to write a program that can compute the last non-zero digit of the factorial for N. For example, if your program is asked to compute the last nonzero digit of 5!, your program should produce “2” because 5! = 120, and 2 is the last nonzero digit of 120.
Input
Input to the program is a series of nonnegative integers, each on its own line with no other letters, digits or spaces. For each integer N, you should read the value and compute the last nonzero digit of N!.
Output
For each integer input, the program should print exactly one line of output containing the single last non-zero digit of N!.
Sample Input
1
2
26
125
3125
9999
Sample Output
1
2
4
8
2
8
问题链接:ZOJ1222 Just the Facts 问题简述:
计算阶乘n!的最后一个不为0的数字。 问题分析:
这个题与参考链接类似,但是是大数计算问题,需要特殊处理。 程序说明:(略) 参考链接:POJ1604 UVA568 UVALive5499 Just the Facts【模除+打表】 题记:(略)
AC的C++语言程序如下:
/* ZOJ1222 Just the Facts */#include#include#includeusingnamespace std;constint N =1000;char s[N];int a[N];intlastdigit(char buf[]){constint mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};int len =strlen(buf), ret =1;for(int i =0; i < len; i++)
a[i]= buf[len -1- i]-'0';while(len){
len -=!a[len -1];
ret = ret * mod[a[1]%2*10+ a[0]]%10;for(int j =0, i = len -1; i >=0; i--)
j = j *10+ a[i], a[i]= j /5, j %=5;}return ret;}intmain(){while(scanf("%s", s)!=EOF)printf("%d
",lastdigit(s));return0;}