HDOJ1042 N!

来源:互联网 发布:js获取身份证号码 编辑:程序博客网 时间:2024/05/19 07:10

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 86344    Accepted Submission(s): 25402


Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 

Input
One N in one line, process to the end of file.
 

Output
For each N, output N! in one line.
 

Sample Input
123
 

Sample Output
126
 
计算阶乘,使用long大概20的时候就超了,使用大数太慢。
应该使用数组的方式,考虑到N最大是10000,初步估算有四万位。
建立一个有长度为八千的int数组,每一个存放五位数。

import java.util.Scanner;public class Main{private static Scanner scanner;public static void main(String[] args) {scanner = new Scanner(System.in);while (scanner.hasNext()) {int n = scanner.nextInt();// n最大是100000,最多有40000位,一个num[i]放五位数字int num[] = new int[8000];// 40000/5 = 8000num[0] = 1;int len = 1;// 记录有效数字到了哪了for (int j = 2; j <= n; j++) {for (int i = 0; i < len; i++) {num[i] *= j;}for (int i = 0; i < len; i++) {if (num[i] > 99999) {num[i + 1] += num[i] / 100000;//num[i] %= 100000;}}if (num[len] != 0) {// 向前拓展一位len++;}}// System.out.println("len="+len);// 前面这个不输出有效数前面的0System.out.print(num[--len]);while (len > 0) {System.out.printf("%05d", num[len - 1]);len--;}System.out.println();}}}