1. 程式人生 > >poj 2731 求10000以內n的階乘(大數問題)

poj 2731 求10000以內n的階乘(大數問題)

2731:求10000以內n的階乘

總時間限制: 
3000ms 
記憶體限制: 
655360kB
描述
求10000以內n的階乘。
輸入
只有一行輸入,整數n(n<=10000)。
輸出
只有一行或多行,根據n!的數值位數決定。
每50位輸出一行,位數不足50時,前面補零。
樣例輸入
100
樣例輸出
00000000000000000000000000000000000000000093326215
44394415268169923885626670049071596826438162146859
29638952175999932299156089414639761565182862536979
20827223758251185210916864000000000000000000000000
提示
可使用java.math.BigInteger進行計算。
這道題一看到提示就想到用java來做(也用好多用c++過了的,效率也挺的),但是還是要注意這道題的輸出控制,今天就在這個輸出控制上卡了好久,前端補零,這個平時也沒有遇到過,值得注意一下;還有就是 biginteger的範圍問題,可能網上別人說,基本上電腦上能執行出的結果都能用biginteger儲存,開始做的時候,沒控制輸出,直接就用biginteger進行運算,最後測試的時候測試100,1000都能出結果,1500的時候就不行了,我開始一直以為是演算法錯了,想要修改演算法;後來jj大神給我了提示,java中一行輸出的元素是有要求的,一行不能輸出那麼多個元素,一行輸出的元素是有極限的,所以題目才會限制我們的一行元素的輸出;解決這個問題之後,怎麼在前端添零卡了我好久;
開始的思路是這樣的,用biginteger計算出階乘的結果,然後用一個字元陣列儲存(開始還想用string類的,後面不知道怎麼操作了),在前端添零我是這麼處理的,先用一個迴圈判斷字串的長度len是否整除50,不整除j++,然後輸出一個0;儲存j的值,後面再用一個迴圈輸出字串,在第一個換行的時候要控制好,後面的換行都是(i+j)%50;
下面是用java ac的程式碼;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanf=new Scanner(System.in);
		int n=scanf.nextInt();
	    BigInteger sum=BigInteger.ONE;
	    for(int i=1;i<=n;i++)
	    {
	      sum=sum.multiply(BigInteger.valueOf(i));
	    }
	    char [] s=sum.toString().toCharArray();
	    int len=s.length,j=0;
	    while(len%50!=0)
    	   { 
	      System.out.print(0);
	      j++;//儲存前面零的個數;
	      len++;
    	   }
	    for(int i=0;i<s.length;i++)
	    {
	    	if(((j+i)/50==1&&(j+i)%50==0)||(i+j)%50==0)//控制換行
	    		System.out.println();
	    	System.out.print(s[i]);
	    }
	}
}
這道題也可以用c++來做,c++來做的話,基本就是套用模板;還是要理解原理。