日常学习:Java队列解决素数环

前言:

        最近的有点忙,加上懒惰就忘了写文章了,以后会加强自己的作息哈哈,争取每周都能带来几个实用的代码。

一、

        今天给大家带来的是运用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的日常学习和技巧,请大家多多支持与鼓励,有想一起学习的也欢迎留言,也希望能各位读者大大点个赞

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航SDB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值