91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Josephus環的解法有哪些

發布時間:2021-08-11 14:39:48 來源:億速云 閱讀:97 作者:小新 欄目:編程語言

小編給大家分享一下Josephus環的解法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

約瑟夫環

約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。

通常解決這類問題時我們把編號從0~n-1,最后結果+1即為原問題的解

引用別人的一個圖:直觀說明問題

分析:

  • 第一步:從1開始報數為3的時候就刪除3號結點

  • 第二步:從4號結點開始報數,當為3的時候刪除6號結點;

  • 第三步:從7號結點開始報數,當為3的時候刪除1號結點;

  • 第四步:從2號結點開始報數,當為3的時候刪除5號結點;

  • 第五步:從7號結點開始報數,當為3的時候刪除2號結點;

  • 第六步:從4號元素開始報數,當為3的時候刪除8號結點;

  • 第七步:又從4號開始報數,當為3的時候刪除4號結點,此時鏈表中只有一個7號結點,所以最后的結點就是7號結點;

1.模擬解法

public class 模擬 {
  public static void main(String[] args) {
    Scanner in=new Scanner(System.in);

    //總人數
    int n=in.nextInt();
    // 數到m的那個人出列
    int m=in.nextInt();
    // 初始化為0 都沒有出去
    int [] arr=new int[n];

    //剩下的人數
    int peopleLeft=n;
    //初始化下標
    int index=0;
    // 下標計算器
    int count=0;
    // >0 出循環為負
    while (peopleLeft>1){
      if(arr[index]==0){
        // count為計步器 不是下標指向
        count++;
        if(count==m){
          arr[index]=1;
          count=0;
          peopleLeft--;
        }
      }
      index++;
      if(index==arr.length){
        index=0;
      }
    }
    for (int i = 0; i < arr.length; i++) {
      if(arr[i]==0){
        System.out.println(i+1);
      }
    }
  }
}

2.遞歸解法

/**
   * 遞歸式:
   * f(1)=0; 第一個位置永遠為0
   * f(i)=f(i)+m%n;
   */
  public static int yuesefu(int n,int m){
    if(n==1){
      return 0;
    }else {
      return (yuesefu(n-1,m) + m) % n;
    }
  }
  public static void main(String[] args) {
    System.out.println(yuesefu(41,3)+1);
    vailCode(41,3);
  }

  //逆推驗證代碼
  public static void vailCode(int a,int b){
    System.out.print(b);
    int reslut;
    for (int i = a; i >=2 ; i--) {
       reslut=2;
      for (int j = i; j <=a ; j++) {
        reslut=(reslut+b)%j;
      }
      System.out.printf("->%d",reslut+1);
    }
  }

3.循環鏈表解法

public class CircularLinkedList {
  public static void main(String[] args) {
    /**
     * 節點類
     */
    class Node{
      private int data=1;
      private Node next;
      Node(){
        next=null;
      }
    }

    Node head,temp;
    head=new Node();
    head.data=1;

    int a=41;
    int b=3;
    // 臨時節點
    temp=head;
    for (int i = 0; i < a; i++) {
      Node new_node=new Node();
      new_node.data=i+1;
      temp.next=new_node;
      temp=new_node;
    }
    temp.next=head.next;
    while (head.next!=head){
      for (int i = 0; i < b-1; i++) {
        head=head.next;
      }
      System.out.print("->"+(head.data+1));
      head.next=head.next.next;
    }
    System.out.println(head.data);
  }
}

4.Collection解法

public static void main(String[] args) {
    int a=41;
    int b=3;
    LinkedList<Integer> list = new LinkedList<>();
    for (int i = 0; i < a; i++) {
      list.add(i+1);
    }
    while (list.size()>1){
      for (int i = 0; i < b-1; i++) {
        list.add(list.remove());
      }
      System.out.print("->"+list.getFirst());
      list.remove();//remve head
    }
    System.out.println(list.getFirst());
  }

以上是“Josephus環的解法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

施秉县| 永德县| 兰州市| 宜昌市| 杭州市| 得荣县| 通榆县| 临海市| 自治县| 绵阳市| 宁河县| 濉溪县| 泸州市| 腾冲县| 广宗县| 慈溪市| 连城县| 长汀县| 呼伦贝尔市| 库车县| 博野县| 三江| 元阳县| 清镇市| 武冈市| 定远县| 隆林| 乐至县| 通许县| 尚志市| 南投县| 弥勒县| 镶黄旗| 虞城县| 辽宁省| 志丹县| 太和县| 资源县| 阿尔山市| 拉萨市| 临夏市|