阶乘计算
问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
思路分析:
题目本身已经给提供了较为完整的解题思路,采用数组来解决大整数的范围问题。
(1)动态的给数组每一位乘以下一个数字,动态的改变数组中每一位的数值,直到乘以到n为止,同时也要注意满10进位的问题;
(2)最后倒序输出;
(3)排除数组中前面的0;
代码如下:(关键代码的注释已在以下代码中标出)
package lanqiaobei;
import java.util.Scanner;
public class Factorial_calculation {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
factorial_calculation(n);
}
public static void factorial_calculation(int n ) {
//3000是为防止越界尽可能取得大的范围;
int[] arr = new int[3000];
int res = 1 , k=0;
arr[0] = 1;
//用来表示 进位
int flag = 0;
//计算n!时 从1到n的数字;
for(int i = 2 ; i <= n ; i++) {
//逐个对数组中的每一个数值乘以下一个即将要乘的数字i;
for(int j = 0 ; j< arr.length ; j++) {
res = arr[j] * i + flag;
arr[j] = res % 10;
flag = res / 10;
}
}
//除去0;
int i = arr.length-1;
for(;i>=0;i--) {
if(arr[i] != 0) {
break;
}
}
for(int j = i; j >= 0;j--) {
System.out.print(arr[j]);
}
}
}
注:通过这道题学到 “ 大整数可以用数组来存储 ” 的思路,动态对每一位数值进行乘法进位运算。