ZOJ1222 Just the Facts【大数+模除】

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 <iostream>
#include <cstdio>
#include <cstring>

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\n", lastdigit(s));

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tigerisland45/p/10425593.html
今日推荐