问题描述
输入一个正整数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
解题技巧
题目要求浅显易懂,就是求阶乘,麻烦的是最终答案会超出整型范围,因此算法描述里提示我们用数组处理(不,是明示)。其实大可不必,Java里有处理任意大整型数的BigInteger类,使用得当,会使代码简洁高效,丝滑飘逸─━ _ ─━✧
代码实现
import java.io.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
BigInteger a = new BigInteger(br.readLine()); //输入数据
BigInteger num = new BigInteger("1"); //最终结果(初始为1)
while(a.compareTo((new BigInteger("1"))) != 0) {
//如果a尚未自减到1,则一直累乘,
num = num.multiply(a); //num = num x a
a = a.subtract(new BigInteger("1")); //a = a - 1
}
out.print(num);
out.flush();
}
}
运行截图
补充说明
BigInteger类一些常用函数:
BigInteger a = new BigInteger(str);
BigInteger b = new BigInteger(str); //定义任意大的整型数
a.add(b); //a+b
a.subtract(b); //a-b
a.multiply(b); //a*b
a.divide(b); //a/b
a.divideAndRemainder(b); //返回商和余数,返回值为BigInteger[]数组
a.compareTo(b); //比较a和b的值,返回负数则a<b,返回0则a=b,返回正数则a>b