蓝桥杯【阶乘计算】Java

问题描述

输入一个正整数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

猜你喜欢

转载自blog.csdn.net/m0_50816725/article/details/112509728
今日推荐