蓝桥杯练习——质因数分解
问题
【问题描述】
求出区间[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
思路
对于m到n的数,先判断如果是质数,就直接输出,否则进入fun函数
在fun函数中,先以所有质数中最小的作为除数,当x对它能整除时对x进行辗转相除;当发现不能整除时,相加到质数再相除。
代码
import java.util.ArrayList;
import java.util.Scanner;
import java.lang.Math;
public class Main {
static boolean prime(int x) { //true质数,false不是
int i;
if(x==1)return false;
int k=(int)Math.sqrt((double)x);
for(i=2;i<=k;i++) {
if(x%i==0)
return false;
}
return true;
}
static void find(int x) { //用短除法找到每个分解的质数
ArrayList<Integer> aList=new ArrayList<>();
int i,k=2,x1=x,l,sum=0;
while(x1!=1) {
if(x1%k==0) { //是质因数,除它,加入集合
x1/=k;
aList.add(k);
sum++;
}
else {
k++;
while(!prime(k)) {
k++;
}
}
}
System.out.print(x+"="+aList.get(0));
for(i=1;i<sum;i++) {
System.out.print("*"+aList.get(i));
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
int i;
for(i=m;i<=n;i++) {
if(i==1) {
System.out.println("1=1");
}
else if(prime(i)) {
System.out.println(i+"="+i);
}
else {
find(i);
}
}
}
}