题目背景
质数(又称“素数”)是指在大于 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);
}
}
}