「ACM-ICPC基础算法」

系列文章目录

本系列文章是关于《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时,代码运行结果如下:


在这里插入图片描述

总结


# 这段时间有点忙,不过博客会不断更新,希望给大家带来一些帮助!!!
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值