基础练习 分解质因数
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
分析
“分解质因数” 是找出哪些质数乘起来的积是等于原来的数。
一些例子:
例子 1: 12 的质因子是什么?
最好是从最小的质数开始。最小的质数是 2。我们看看:
12 ÷ 2 = 6
12 可以被 2 整除。 第一步完成了!
但 6 不是质数,所以还没做完。再试试 2 :
6 ÷ 2 = 3
3 是质数,所以有答案了:
12 = 2 × 2 × 3
你可以看到,每个因子都是质数,所以答案是对的。
例子 2: 147 的质因子是什么?
147 除以 2 的结果是整数而没有余数吗?
147 ÷ 2 = 73½
不是。73½ 不是整数。
试下一个质数,3:
147 ÷ 3 = 49
行了。接下来我们分解 49 为因子,结果是 7 为最小的可以整除 49 的质数 :
49 ÷ 7 = 7
我们不用再做下去了,因为所有的因子都是质数。
147 = 3 × 7 × 7
例子 3: 17 的质因子是什么?
17 是个质数。
所以不能做下去了。
17 = 17
Java 代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] s = in.readLine().split(" ");
int n = Integer.parseInt(s[0]);
int m = Integer.parseInt(s[1]);
// 存放分解后的质因数集
ArrayList<Integer> a;
for (int i = n; i <= m; i++) {
a = new ArrayList<>();
int j = i;
int x = 2;
while (!isPrime(j)) {
if (j % x == 0) {
j = j / x;
a.add(x);
} else if (j % x != 0) {
while (true) {
x++;
if (isPrime(x))
break;
}
}
}
a.add(j);
String result = String.valueOf(a.get(0));
for (int k = 1; k < a.size(); k++) {
result = result + "*" + a.get(k);
}
System.out.println(i + "=" + result);
}
}
// 判断是否为质数
public static boolean isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
}
return true;
}
}