问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1*a2*a3...(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
解题思路:
先将10000内的所有素数提取至数组中(素数算法--- >传送门)。在分解某个范围的因数时,对于本身是素数的,直接特判出来(可以在筛选素数时,顺便再造个哈希表),可以省不少时间。在分解合数时,如果该合数被素数数组选中过,则下一轮仍从数组第一个开始,否则从数组第二个值判断(设置一个标志变量)。
java代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int st = Integer.parseInt(split[0]);
int end = Integer.parseInt(split[1]);
int []arr = new int[1229];
boolean []flag = new boolean[10001];
int index = 0;
for(int i = 2; i <= 10000;i++) {
int j = 0;
for(j = 2;j <= Math.sqrt(i);j++) {
if(i % j == 0)break;
}
if(j == (int)Math.sqrt(i) + 1) {
arr[index++] = i;
flag[i] = true;
}
}
StringBuilder builder = new StringBuilder();
for(int i = st;i <= end;i++) {
if(flag[i]) {
builder.append(String.format("%d=%d\n", i,i));
}else {
int tag = i;
builder.append(i + "=");
boolean h = false;
int j = -1;
while(true) {
if(!h) {
j++;
}else {
j = 0;
}
if(tag == 1)break;
if(tag % arr[j] == 0) {
h = true;
if(tag / arr[j] == 1) {
builder.append(arr[j] + "\n");
}else {
builder.append(arr[j] + "*");
}
tag /= arr[j];
}else {
h = false;
}
}
}
}
System.out.print(builder.toString().trim());
}
}