问题描述
输入一个正整数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!的值。输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
1.显然使用BigInteger类直接for循环运算就能做出来。
略
2.按照题目要求用数组做
思路:
每轮阶乘时,数组从后往前每个元素都进行乘法,用temp记录当前位置元素乘法运算并加上进位的结果,carry记录进位的数。
当数组中每个元素都进行了正确运算但此时carry还不是0,说明运算结果位数增加,需要把carry新增到原数组前面。
表达不是很清楚,按照代码列竖式走一遍应该就明白了。
package practice;
import java.util.ArrayList;
import java.util.Scanner;
public class 阶乘计算 {
public static void main(String[] args) {
ArrayList<Integer> result = new ArrayList<>();
result.add(1);
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
for (int i = 2; i <= n; i++) {
int carry = 0; //个位无法获得进位数
for (int j = result.size() - 1; j >= 0; j--) {
int temp = result.get(j) * i + carry; //当前元素乘加结果
result.set(j, temp % 10); //修改当前元素
carry = temp / 10; //修改进位数
while (j == 0 && carry != 0) { //存在位数增加的情况
result.add(0, carry % 10);
carry /= 10;
}
}
}
for (int i : result)
System.out.print(i);
}
}