约瑟夫问题编码实现(四种解法)

问题描述:

有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,打印输出依次退出小朋友的编号?

List集合实现

import java.util.LinkedList;
import java.util.List;

public class JosephusList {
    
    
  static int m = 0,n=0;

  public static void main(String[] args) {
    
    
    List<Integer> list = new LinkedList<Integer>();
    for (int i = 1; i <= 500; i++) {
    
    
      list.add(i);
    }

    while (list.size() >0) {
    
    
      for (int i = 0; i < list.size(); i++) {
    
    
        m++;
        if (m % 3 == 0) {
    
    
          m = 0;
          n++;
          System.out.print(list.get(i)+"\t");
          if (n%10==0)  System.out.println(); //每10个编号为一行输出
          list.remove(i);
          i--;
        }
      }
    }
  }
}


数组实现


public class JosephusArray {
    
    
  public static void main(String[] args) {
    
    
    int[] children = new int[500];
    for(int i=0;i<500;i++){
    
    
      children[i]=i+1; //小朋友站圈并编号
    }
    int num=0,m=0; 
    while(true){
    
    
      if (num==500){
    
    
        break;
      } 
      for(int i=0;i<500;i++){
    
    
        if(children[i]!=0){
    
    
          m++;
          if(m==3){
    
    
            System.out.println(children[i]); //退出小朋友的编号
            children[i]=0; //退出后编程置为0
            m=0;
            num++;
          }
        }
      }
    }
  }
}

队列实现

import java.util.ArrayDeque;
import java.util.Deque;

public class JosephusQueue {
    
    
  public static void main(String args[]) {
    
    
    int a[] = new int[500];
    for (int i = 0; i < 500; i++) {
    
    
      a[i] = i + 1;
    }
    // 使用队列求解约瑟夫环
    Deque<Integer> deque = new ArrayDeque<Integer>();
    for (int i = 0; i < a.length; i++) {
    
    
      deque.add(a[i]);// 全体入列
    }
    int count = 1;
    while (deque.size() > 1) {
    
    
      int number = deque.pollFirst(); // 出列操作
      if (count != 3)
        deque.offerLast(number); // c重新入列
      else {
    
    
        System.out.println("出圈号码:" + number);
      }
      if (count == 3)
        count = 0;
      count++;
    }
    System.out.println("剩下的人的号码是:" + deque.peek());
  }
}

自定义链表实现


public class JosephusMyList {
    
    
  static Child c1;
  public static void main(String[] args) {
    
    
         c1 = new Child(1);
        appendChild(c1,2);// 小朋友站圈
        int n=1;
        Child p=c1;
        Child previous;
        while(p.getNext()!=p)
       {
    
    
          previous= p;
          p=p.getNext();
          n++;
          if (n % 3==0){
    
    
          System.out.println(p.getNum());
          previous.setNext(p.getNext());
          p=previous;
            
          }
    
        }
        System.out.println(p.getNum());
}
    static void appendChild(Child c ,int num){
    
    
      if (num==501){
    
    
        c.setNext(c1);
        return;  
      }
      Child next  = new Child(num);
      c.setNext(next);
        appendChild(next,num+1);
    }

}
//定义小朋友类
class Child{
    
    
  Child next;
  int num;
  public Child(int num){
    
    
    this.num = num;
  }

  public Child getNext() {
    
    
    return next;
  }
  public void setNext(Child next) {
    
    
    this.next = next;
  }
  public int getNum() {
    
    
    return num;
  }
  public void setNum(int num) {
    
    
    this.num = num;
  }
 }

猜你喜欢

转载自blog.csdn.net/qq_52297656/article/details/121411208
今日推荐