现在的位置: 首页 > 综合 > 正文

UVa 568 – Just the Facts

2012年01月08日 ⁄ 综合 ⁄ 共 1545字 ⁄ 字号 评论关闭

UVa 568 - Just the Facts

Table of Contents

1 题目

===================

  Just the Facts 


The expression N!, read as ``N factorial,"
denotes the product of the first 
N positive integers, whereN 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 any factorial for ( $0 \le N \le 10000$).
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


Miguel A. Revilla 
1998-03-10

===================

2 思路

题目大意是计算N!最后一个非0位,为了避免溢出,代码中使用了模运算。 为了取得非0位,一旦计算结果是10的倍数,就将末位的0通过除法消除。

3 代码

/*
 * Problem: UVa 568 - Just the Facts
 * Lang: ANSI C
 * Time: 0.019
 * Author: minix
 */

#include <stdio.h>

#define N 100000000000

int main() {
  long long sum;
  int i, n;

  while (scanf ("%d", &n) != EOF) {
    sum = 1;
    for (i=1; i<=n; i++) {
      sum *= i;
      sum %= N;
      while (sum % 10 == 0) sum /= 10;
    }
    while (sum != 0 && sum % 10 == 0) sum /= 10;
    printf ("%5d -> %lld\n", n, sum % 10);
  }

  return 0;
}

抱歉!评论已关闭.