《ACM-ICPC算法竞赛基础算法》

255 阅读1分钟

系列文章目录

本系列文章是关于《ACM-ICPC算法竞赛基础算法》的文章!


题目介绍

零、求指定数字的阶乘

	我们知道随着给定数字n的增大,n!的增长速度非常快,其增长速度高于指数的增长速度,
	所以这是一个高精度计算问题。

代码运行测试结果:

在这里插入图片描述


在这里插入图片描述


# 一、代码如下:
import java.util.Scanner;

public class LargeIntegerFactorial {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        long[] ans = new long[10001000];
        long n = sc.nextLong();
        ans[0] = 1;

        int l = 0;
        long num = 0;
        for(int i = 1; i<=n;++i)
        {
            num = 0;
            for(int j = 0; j <= l; j++)
            {
                num = num + ans[j] * i;
                ans[j] = num % 10;
                num /= 10;
            }
            while(num != 0)
            {
                ans[++l] =num % 10;
                num /= 10;
            }
        }
        for(int i = l; i >= 0; --i)
        {
            System.out.print(ans[i]);
        }
        return;
    }
}


二、代码解析:

	我们接下来把n设置为4,进行代码的实例演示以及解析
	{
		long[] ans = new long[10001000];//定义答案数组
		n = 4;//设置指定数字为4
		ans[0] = 1;	//将答案数组的第一位设置为1
	    int l = 0;//定义变量l,用来记录n!的数字有多少位
	    long num = 0;//定义变量num
	    for(int i = 1; i<=n;++i)//核心代码,将在下边进行实例解析
	    {
	        num = 0;
            for(int j = 0; j <= l; j++)
            {
                num = num + ans[j] * i;
                ans[j] = num % 10;
                num /= 10;
            }
            while(num != 0)
            {
                ans[++l] =num % 10;
                num /= 10;
            }	   
       }
       
       
       {
       		当i == 1时,j == 0, j <= l (0 <= 0), num = 0;
       			num = num + ans[0] * i = 0 + 1 * 1 = 1;
       			ans[0] = num % 10 = 1 % 10 = 1;
       			num = num / 10 = 1 / 10 = 0;
       			
       		当i == 2时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 1 * 2 = 2;
       			ans[0] = num % 10 = 2 % 10 = 2;
       			num = num / 10 = 2 / 10 = 0;
       			
       		当i == 3时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 2 * 3 = 6;
       			ans[0] = num % 10 = 6 % 10 = 6;
       			num = num / 10 = 6 / 10 = 0;
       			
       		当i == 4时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 6 * 4 = 24;
       			ans[0] = num % 10 = 24 % 10 = 4;
       			num = num / 10 = 24 / 10 = 2;
       			进入while循环,
       				num = 2 != 0;
       				ans[++l] = num % 10 = 2 % 10 = 2;(此时l == 1);
       				ans[1] = 2;
       				num = num / 10 = 2 / 10 = 0;
       		
       		当i == 5时,j == 0,j <= l (0 <= 1),num = 0;
       			num = num + ans[0] * i = 0 + 4 * 5 = 20;
       			ans[0] = num % 10 = 20 % 10 = 0;
       			num = num / 10 = 2;
       		当i == 5时,j == 1,j <= l (1 <= 1),num = 2;
       			num = num + ans[1] * i = 2 + 2 * 5 = 12;
       			ans[1] = num % 10 = 12 % 10 = 2;
       			num = num / 10 = 12 / 10 = 1;
       			进入while循环,
       				num = 1 != 0;
       				ans[++l] = num % 10 = 1 % 10 = 1;(此时l == 2);
       				ans[2] = 1;
       				num = num / 10 = 0;
       		结束。
       }
	}
	

当n == 5时,代码运行结果如下:


在这里插入图片描述

总结


# 这段时间有点忙,不过博客会不断更新,希望给大家带来一些帮助!!!