蓝桥杯2023A-06-阶乘的和(Java)

6.阶乘的和

  • 题目描述

image-20240409153444882

输入格式

输入的第一行包含一个整数 n 。

第二行包含 n 个整数,分别表示 Ai,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

3
2 2 2

样例输出

3
  • 思路分析
本题是要求解n个数Ai的阶乘的和的可以用m!表示的最大因数,对于此题,我们先找找规律
    
2+ 2+ 2= 2* (1 + 1 + 1) = 2* 3 = 3!
我们可以看到,先提取最小的Ai作为公因数,剩余的元素和为3,刚好可以凑成3的阶乘
    
4+5+6= 4* (1 + 5 + 5*6)
由于(1 + 5 + 5*6)没有公因式,因此此式子的结果只能为42+ 2+ 2+ 3+ 3+ 3= 2* (1 + 1 + 1 + 3 + 3 + 3) = 2! * (3 + 3 + 3 + 3) = 2! * 3 * (1 + 1 + 1 + 1)
= 2 * 3 * 4 = 4!
    
根据上述的规律我们不难看出,每次我们提取最小的阶乘为公因式,剩余括号中的和如果为相同的数,我们可以再次提取公因式看它是否为最小阶乘公因式数大1的数,如果是便可以组成新的值,否则还是上述提取的最小公因式
  • Java代码实现
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();//表示要输入整数的个数
        long[] nums = new long[n];//用来记录n个Ai的值
        long min = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextLong();
            if (nums[i] < min) min = nums[i];//找出最小的参数
        }

        long m = min;//m!表示最小因数
        long count = 0;//表示在nums中有几个是相同的m
        while (true) {
            count = count / m;
            for (int i = 0; i < n; i++) {//与最小公因数相等的数的个数
                if (nums[i] == m) count++;
            }

            if (count != 0 && count % (m + 1) == 0) m++;
            //将相同m提取之后如果count == m+1,说明此时可以提取m+1!为最小因数,因为m!为最小的因数,剩余因数
            //一定大于m!,因此也包含m+1,所以可以提出来(m+1)!作为新的因数
            else break;
        }
        System.out.println(m);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值