HDOJ1042 N!

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
  
  
1 2 3
 

Sample Output
  
  
1 2 6
 
计算阶乘,使用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 = 8000
			num[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);
			// 前面这个不输出有效数前面的0
			System.out.print(num[--len]);
			while (len > 0) {
				System.out.printf("%05d", num[len - 1]);
				len--;
			}
			System.out.println();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值