问题描述
求出区间[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
思路:没啥好说的,直接暴力分解就行,注意的几个地方,一个是2要单独说明,刚开始的时候没注意到,这个地方错了,不过还是要看你用的啥方法,再就是注意控制格式。在这里用了队列临时存储因子,一是FIFO比较适合我的这种想法,因为本身就是按顺序分解的,使用数组的话不太好掌握数组的大小,再就是队列poll后会删除,也省了清空的劲。其他的都在注释里了。因为是临时抱佛脚,也是个代码渣渣,代码难免会有问题和不美观,我会慢慢改进的,也希望大佬们能给一些好的建议或者推荐的课程。爱你们
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
public class Main {
public static int judge(int num) { //判断是不是素数,用于判断因子是不是素数
int k;
for(int i=2 ; i<=num;i++){ //最小的素数是2
if(num % i == 0&& i != num){ //除了1和本身之后没有约数即为素数
return 0;
}else if(i == num){
return 1;
}
}
return 1;
}
private static int caculator(int num) { //找因数的限制范围
int k;
if(num==2)//注意这个地方,因为找因子的时候要从2开始一直到目标素数的一半,如果不特别说明2的话,2会被自动过滤掉,导致队列出现null
return num;
if(num%2==0)
k=num/2;
else
k=(num+1)/2;
return k;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int a,b,num_judge,temp;
a=in.nextInt();//左边界
b=in.nextInt();//右边界
Queue< Integer> queue=new ArrayBlockingQueue<Integer>(b);//定义了一个队列用于保存得到的因子,因为求因子的时候已经按照顺序排列的,所以FIFO就可以
for(int n=a;n<=b;n++)
{
int tmp=n;
for (int j=2;j<=caculator(n);)
{
if(judge(tmp)==1)//如果目前的tmp是素数,证明已经分解到最后一个了,这个tmp可以直接推进队列中
{queue.offer(tmp);
break;
}
if(judge(j)==0)//如果因子j不是素数,直接结束此次循环,将因子+1
{
j++;
continue;
}
if(tmp%j!=0)//如果j为素数但是此时的tmp无法整除,则结束此次循环,将因子+1
{
j++;
continue;
}
if(tmp%j==0)//如果j是素数且能被tmp整除,则推入队列,将tmp变为tmp/j,继续参与下次循环,直到本身变成素数,也就是最后一个因子
{queue.offer(j);
tmp=tmp/j;
}
}
if(queue.size()==1)//如果队列里只有一个元素,证明n本身就是一个不能分解的素数,直接出队列就行
System.out.println(n+"="+queue.poll());
else
{
System.out.print(n+"=");
while(queue.size()>1)//超过1个,证明有多个因子,下面为了控制格式,分开输出
{
System.out.print(queue.poll()+"*");
}
System.out.println(queue.poll());
}
}
}
}