前言:
最近的有点忙,加上懒惰就忘了写文章了,以后会加强自己的作息哈哈,争取每周都能带来几个实用的代码。
一、
今天给大家带来的是运用java队列解决素数环,当时老师给我们这个题目的时候没有太具体的说去怎么做,我也在博客上看了的大佬的解决方法,都是顺序表与队列结合来解决的,我今天带来的是双队列来解决素数环,听起来是不是很高级哈哈。
二、程序实现
1、素数环原理
素数环指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。(这里实现的素数环没有考虑头和尾)。
2、实现思路
先将1放入素数环(目标队列);对2~n的自然数num,测试目标队列的尾元素+num是否为素数,若是,则将num添加到素数环,否则说明num暂时无法处理,必须等待再次测试,所以还需要设置一个等待队列,这里要注意,程序并不会像我们能够发现剩下的数全部不能处理了,如果不加以条件判断,它就会一直去尝试,进入死循环,所以我们还需要一个计数器count,用于计数。
3、代码实现
1、队列的实现
这里我使用的是顺序循环队列,因为循环队列存在假溢出的现象,详细介绍在百度上都能找到我就不多介绍了,实现队列接口,并添加以下方法。
public interface QQueue<E> {
public boolean isEmpty();//判断队列是否非空
public boolean enQueue(E element);//元素入队
public E deQueue();//元素出队
public void show();//显示队列元素
public E getRear();//获取队尾元素
public int length();//获取队列长度
}
2、队列接口方法实现
public class SeqQueue<E> implements QQueue<E>{
private Object[] value;
private int front,rear;
public SeqQueue () {
this.value = new Object[10];
this.front = this.rear = 0;
}
public SeqQueue (int capacity) {
this.value = new Object[capacity];
this.front = this.rear = 0;
}
@Override
public boolean isEmpty() {
return this.front == this.rear ;
}
@Override
public boolean enQueue(E element) {
boolean flag = false;
if (element != null) {
//判断队列是否已满
if ((this.rear + 1)%this.value.length == this.front){
//扩容
Object[] old = this.value;
this.value = new Object[this.value.length * 2];
int j = 0;
for (int i = this.front;i != this.rear;i = (i+1)%old.length){
this.value[j] = old[i];
j++;
}
this.front = 0;
this.rear = old.length -1;
}
this.value[this.rear] = element;
this.rear = (this.rear + 1) % this.value.length;
flag = true;
}
return flag;
}
@Override
public E deQueue() {
E deleted = null;
if(!this.isEmpty()){
deleted = (E)this.value[this.front];
this.front = (this.front + 1) % this.value.length;
}
return deleted;
}
@Override
public void show() {
int tmp = this.front;
while (tmp != this.rear) {
System.out.print(this.value[tmp]+" ");
tmp = (tmp + 1) % this.value.length;;
}
System.out.println();
}
@Override
public E getRear() {
E gotten = null;
if(!this.isEmpty()){
int index = this.rear-1;
if (index < 0){
index = this.value.length;
}
gotten = (E) this.value[index];
}
return gotten;
}
@Override
public int length() {
int count = 0;
for (int i = this.front; i != this.rear; i= (i+1)%this.value.length) {
count++;
}
return count;
}
}
3、主要代码
添加一个isPrime方法用于测试是否为素数,然后在PrimeRing方法中实现素数环Nulllist(目标队列)和工作队列workQueue(等待队列)。
public class PrimeRing {
//判断素数
public boolean isPrime(int num) {
for (int i = 2;i < num;i++){
if(num % i == 0){
return false;
}
}
return true;
}
public PrimeRing(int n){
SeqQueue<Integer> Nulllist = new SeqQueue<Integer>();
SeqQueue<Integer> workQueue = new SeqQueue<Integer>();
//将1加入素数环
Nulllist.enQueue(1);
//将2~n的数添加到等待队列
for (int i = 2;i <= n; i++){
workQueue.enQueue(i);
}
//count用于计数
int count = 0;
while (!workQueue.isEmpty() && count < workQueue.length()) {
int num1 = workQueue.deQueue();
int num2 = Nulllist.getRear();
int num = num1+num2;
if(isPrime(num)){
//是素数就入素数环
Nulllist.enQueue(num1);
//计数器一定要清零
count = 0;
}else{
//否则入工作队列等待
workQueue.enQueue(num1);
count++;
}
}
//当工作队列为空时表示素数环已构成,否则无法构成素数环
if(workQueue.isEmpty()){
System.out.println(n+"所构成的素数环为:");
System.out.println("");
Nulllist.show();
}else{
System.out.println(n+"不能构成素数环");
}
}
public static void main(String[] args) {
//测试
new PrimeRing(7);
}
}
实现结果
以上就是整个程序的实现,如果有哪些地方不懂的,或者有大佬能改进的欢迎留言哦,过段时间应该会给大家带来HTML5跟Python的日常学习和技巧,请大家多多支持与鼓励,有想一起学习的也欢迎留言,也希望能各位读者大大点个赞