题目
给定 n 个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数
第一行包含整数 n
接下来 n 行,每行包含一个正整数 ai
对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行
每个正整数的质因数全部输出完毕后,输出一个空行
(比如说20 = 2乘2乘5,就是2 2 和 5 1,两个2和一个5)
输入:
2
6
8
输出:
2 1
3 1
2 3
public class 质数_分解质因数 {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
while (n-- > 0) {
int x = in.nextInt();
prime_formula_base(x);
System.out.println();
}
}
//试除法得到分解质因数的结果,也就是x的Prime formula,时间复杂度是O(n)
public static void prime_formula_base(int x) {
//枚举所有的小于x且大于2的质数因子
for (int i = 2; i <= x; i++){
if (x % i == 0) {
int res = 0;
while (x % i == 0) {
res++;
x /= i;
}
System.out.println(i + " " + res);
}
}
}
//优化版,时间复杂度是sqrt(n)
public static void prime_formula_op(int x) {
//这里先通过循环找到所有小于根号x的质数因子
for (int i = 2; i <= x/i; i++){
if (x % i == 0) {
int res = 0;
while (x % i == 0) {
res++;
x /= i;
}
System.out.println(i + " " + res);
}
}
//如果说x被所有小于根号x的质数因子除完后,还大于1,说明剩下的一定是那个大于根号x的质因子,直接输出即可 (例如11,43这样的数)
//证明:一个数x中最多包含一个大于根号x的质数因子,很好证明,如果有两个大于根号x的质数因子那么这俩相乘就大于x了,反证法成立
if (x > 1) System.out.println(x + " 1");
}
}
声明:算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流