大數階乘,用陣列存放階乘結果
阿新 • • 發佈:2019-02-07
問題描述 輸入一個正整數n,輸出n!的值。
其中n!=1*2*3*…*n。演算法描述 n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數a,A[0]表示a的個位,A[1]表示a的十位,依次類推。
將a乘以一個整數k變為將陣列A的每一個元素都乘以k,請注意處理相應的進位。
首先將a設為1,然後乘2,乘3,當乘到n時,即得到了n!的值。
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]);
}
}
}
其中n!=1*2*3*…*n。演算法描述 n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數a,A[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]);
}
}
}