ZOJ1222 Just the Facts【大数+模除】

2019-04-14 21:51发布

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 #include using namespace std; const int N = 1000; char s[N]; int a[N]; int lastdigit(char buf[]) { const int 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; } int main() { while (scanf("%s", s) != EOF) printf("%d ", lastdigit(s)); return 0; }