1. 程式人生 > >大數階乘,用陣列存放階乘結果

大數階乘,用陣列存放階乘結果

問題描述  輸入一個正整數n,輸出n!的值。
  其中n!=1*2*3*…*n。演算法描述  n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數aA[0]表示a的個位,A[1]表示a的十位,依次類推。
  將a乘以一個整數k變為將陣列A的每一個元素都乘以k,請注意處理相應的進位。
  首先將a設為1,然後乘2,乘3,當乘到n時,即得到了n!的值。

解決思路

    如演算法描述,將陣列的每一個元素當做一位。第一步,將每一位和當前的n相乘;第二步,處理每一位的進位。

    第二步中的進位處理的思路是這樣的:將當前位儲存的整數的個位留下,同時將進位加給下一位,例如arr[4] 和 當前的n相乘得123,則將‘3’留在arr[4]中,同時將‘12’加給arr[5],以此類推。

     注意臨界位數不夠時,需要將位數+1。

import java.util.Scanner;

public class JieC {

public static void main(String args[]){

Scanner input = new Scanner(System.in);

int n = input.nextInt();
int wei = 1;    //初始化總位數為1
int[] arr = new int[1000];        //定義一個合適的陣列,每一個元素代表一位
arr[0] = 1;    //初始化個位為1



for(int i = 2; i <= n; i++){    //1乘任何數都不會產生進位,故迴圈2~n

for(int j = 0; j < wei; j++){    //先將每位數都乘當前迴圈的n
arr[j] = arr[j] * i;
}

for(int j = 0; j < wei; j++){    //對每個位的進位進行處理的迴圈

if(arr[j] >= 10){            //如果產生進位
arr[j+1] = arr[j+1] + (arr[j] / 10);    //則後一位(arr[j+1])應當加上當前位(arr[j])的進位
arr[j] = arr[j] % 10;    //    同時當前位應當只保留個位

if(j == wei-1){     //如果位數不夠了,則將位數加一
wei++;
}
}
}
}

for ( int k = wei-1; k>=0; k--){   
  System.out.print(arr[k]);
}  
}
}