输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
解题思路:
任何一个数n除了1之外的最小的因数一定是质数,所以分解质因数时,当把n的最小质因数m找到后,再除掉n,得到一个新的数,且这个新的数一定不小于m,因为若小于m,在之前就会被n除掉,一直循环,最后若正好是1,则分解完,否则最后剩下的数仍然是一个质数。时间复杂度介于O(logn)~O(sqrt(n))
Java代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
int m = Integer.parseInt(br.readLine());
divide(m);
System.out.println();
}
}
public static void divide(int x) {
for(int i = 2; i <= x / i; i++) { // 每个数的除了1之外的最小的因数一定是质数
if(x % i == 0) {
int cnt = 0; // 每个质因子出现的次数
while(x % i == 0) {
x /= i;
cnt++;
}
System.out.println(i + " " + cnt);
}
}
if(x > 1) System.out.println(x + " 1"); // 当最后剩下的数不是1时,说明还剩本身的质因数
}
}