Just the Facts
The expression
N
!, read as ``
N
factorial," denotes the product of the first
N
positive integers, where
N
is nonnegative. So, for example,
Just the Facts |
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 any factorial for ( ). 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 not exceeding 10000, 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. Each line of output should contain the value N , right-justified in columns 1 through 5 with leading blanks, not leading zeroes. Columns 6 - 9 must contain `` -> " (space hyphen greater space). Column 10 must contain the single last non-zero digit of N !.
Sample Input
1 2 26 125 3125 9999
Sample Output
1 -> 1 2 -> 2 26 -> 4 125 -> 8 3125 -> 2 9999 -> 8
题意:给出一个数,求这个数的阶乘,输出阶乘结果从低位开始,第一个不为零的数。
一个数无论和多大的数相乘,得出结果的最后几位只需要用该数和大数的最后几位相乘得出。
解析:打表直接输出不就好了?可是long long到了20的阶乘之后就会超范围了,不过存储能够用到的范围内的数不就好了。还是直接上代码吧,感觉挺简单的,也就不能说什么了。
#include <stdio.h>
#include <string.h>
long long f[10009];
void init()
{
f[0] = 1;
f[1] = 1;
f[2] = 2;
long long i;
for(i = 3;i <= 10000;i++)
{
long long ji = i * f[i - 1];
long long yu = ji % 10;
ji = ji / 10;
while(!yu)
{
yu = ji % 10;
ji = ji / 10;
}
ji = ji * 10 + yu;
f[i] = ji % 1000000;
}
}
int main()
{
init();
long long i;
while(~scanf("%lld",&i))
{
printf("%5lld -> %lld\n",i,f[i] % 10);
}
return 0;
}