BASIC-16分解质因数

问题描述

  求出区间[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());
		}
	}
}
}
发布了47 篇原创文章 · 获赞 6 · 访问量 5190

猜你喜欢

转载自blog.csdn.net/qq_41705207/article/details/105303754
今日推荐