分解质因数 - Java实现
问题
给定 n
个正整数 a_i
,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
-
第一行包含整数
n
。 -
接下来
n
行,每行包含一个正整数a_i
。
输出格式
对于每个正整数 a_i
,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数占一行。每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
-
1 ≤ n ≤ 100
-
2 ≤ a_i ≤ 2 × 10^9
-
输入处理:
-
首先,程序从标准输入读取一个整数
n
,表示接下来将输入n
个正整数。 -
然后,程序读取
n
个正整数,存储在数组arr
中。
-
-
主逻辑:
-
solution
方法是程序的主逻辑部分,它遍历数组arr
中的每个整数,并调用divide
方法对每个整数进行质因数分解。 -
对于每个整数,
divide
方法会输出其质因数分解的结果,每个质因数的底数和指数占一行。 -
每个整数的质因数分解完成后,输出一个空行。
-
-
质因数分解:
-
divide
方法实现了质因数分解的逻辑。它从2开始,尝试找到能整除当前整数x
的最小质因数i
。 -
如果找到这样的
i
,则计算x
能被i
整除多少次(即i
的指数e
),并输出i
和e
。 -
然后,从
x
中移除i
的所有因子,继续寻找下一个质因数,直到x
被完全分解。 -
如果最后
x
不等于1(即x
本身是一个质数),则单独输出x
和指数1。
-
–
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class Main {
static int n = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
String[] l1 = br.readLine().split(" ");
n = Integer.parseInt(l1[0]);
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
solution(pw,arr);
pw.flush();
pw.close();
br.close();
}
private static void solution(PrintWriter pw, int[] arr) {
for(int i = 0; i < n; i++) {
divide(pw,arr[i]);
pw.println();
}
}
private static void divide(PrintWriter pw, int x) {
for(int i = 2; i <= x/i; i++) {
// 3、寻找下一个更大的质因子,并重复以下操作
if(x % i == 0) {
//由于第1、2步,可以确保每次的i都是质数
int e = 0;
while(x % i == 0) {
e++;
x /= i; //1、核心:从当前整数x中移除一次质因子i,例如x=18可以移除一个质因子2,然后变成x=9又可以移除两个质因子3
}
pw.println(i + " " + e);
//2、上述循环结束后留下的x不会被i整除,即每次找到一个质因子i,都会从x中清除i,最终x会变成1或自身最大的孤立质数
}
}
// 4、若x最终是最大的孤立质数,则单独输出(也就是x没有变成1)
if(x != 1) {
pw.println(x + " " + 1);
}
}
}