蓝桥杯练习 分解质因数
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
思路分析:
第一步求出2-b的全部质数;
第二步开一个循环,从a到b,对每个数进行分解;
第三步就是具体分解过程:如果这个数本身是质数,那么直接输出;如果不是,那么从2开始判断能否整除:
能整除的话就将2保存下来,再将这个数除以2,继续看能不能被2整除;
当不能整除的时候,就用下一个质数3来判断;
终止条件就是用来分解的数变成了质数,那么就不用再分解了。再将中间保存的值打印出来即可。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
//数据的输入
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
//求出所有的质数
List<Integer> list = new ArrayList<>();
for(int i = 2;i<=b;i++){
boolean flag = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if(i%j==0){
flag = false;
break;
}
}
if(flag){
list.add(i);
}
}
//对每个数进行分解
for (int i = a; i <= b; i++) {
//如果这个数是质数,直接输出
if(list.contains(i)){
System.out.println(i+"="+i);
}else {
//不是质数的话麻烦一点
//先从第一个质数2开始判断是否能整除,能整除的话就除,然后将除的结果再来判断
//如果不能整除,就用下一个质数来判断
//停止条件就是除的结果是一个质数
int temp = i;
List<Integer> res = new ArrayList<>();
int cnt = 0;
while (!list.contains(temp)){
if(temp%list.get(cnt) == 0){
res.add(list.get(cnt));
temp = temp/list.get(cnt);
}else {
cnt++;
}
}
//将中间值输出
System.out.print(i + "="+res.get(0));
for (int j = 1; j < res.size(); j++) {
System.out.print("*"+res.get(j));
}
//还有最后的temp进行输出
System.out.print("*"+temp);
System.out.println();
}
}
}
}