csp202312-2 因子化简(Java)

题目背景

质数(又称“素数”)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。

问题描述

小 P 同学在学习了素数的概念后得知,任意的正整数 n 都可以唯一地表示为若干素因子相乘的形式。如果正整数 n 有 m 个不同的素数因子 p1,p2,⋯,pm,则可以表示为:n=p1^t1×p2^t2×...×pm^tm。

小 P 认为,每个素因子对应的指数 ti 反映了该素因子对于 n 的重要程度。现设定一个阈值 k,如果某个素因子 pi 对应的指数 ti 小于 k,则认为该素因子不重要,可以将 pi^ti 项从 n 中除去;反之则将 pi^ti 项保留。最终剩余项的乘积就是 n 简化后的值,如果没有剩余项则认为简化后的值等于 1。

试编写程序处理 q 个查询:

  • 每个查询包含两个正整数 n 和 k,要求计算按上述方法将 n 简化后的值。

输入格式

从标准输入读入数据。

输入共 q+1 行。

输入第一行包含一个正整数 q,表示查询的个数。

接下来 q 行每行包含两个正整数 n 和 k,表示一个查询。

输出格式

输出到标准输出。

输出共 q 行。

每行输出一个正整数,表示对应查询的结果。

样例输入

3
2155895064 3
2 2
10000000000 10

样例输出

2238728
1
10000000000

解题思路

首先找出在输入数据范围之内的所有质数,再从质数内找到质因数,利用while循环计算指数,将质因数和相应的指数分别存入两个list集合之中,最后排除不符合的情况(指数大于阈值k),最后的数据相乘即可。(博主能力有限,只有80分,有错误欢迎私信指正,也希望有大佬能够带带我)

我的代码(超时80分)

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int q = sc.nextInt();
        double[] n = new double[q];
        int[] k = new int[q];

        for (int i = 0; i < q; i++) {
            n[i] = sc.nextDouble();
            k[i] = sc.nextInt();
        }

        for (int i = 0; i < q; i++) {
            ArrayList<Double> list1 = new ArrayList<>();
            ArrayList<Integer> list2 = new ArrayList<>();
            //先找出区间内所有质数(从小到大)
            for (double j = 2; j < n[i]; j++) {
                boolean isZhi = true;
                for (int l = 2; l < j; l++) {
                    if (j % l == 0) {
                        isZhi = false;
                        break;
                    }
                }
                if(isZhi){
                    //找出质因子,相同指数加一
                    int zs = 0;
                    while (n[i]%j==0){
                        if(!(list1.contains(j))){
                            list1.add(j);
                        }
                        zs++;
                        n[i]=n[i]/j;
                    }
                    if(zs!=0){
                        list2.add(zs);
                    }

                }
            }
            //筛选出符合情况的质因数带指数相乘
            double jg = 1;
            for (int r = 0; r < list1.size(); r++) {
                if(list2.get(r) >= k[i]){
                    jg = jg * Math.pow(list1.get(r),list2.get(r));
                }
            }
            System.out.printf("%.0f\n",jg);
        }

    }
}

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值