• 约瑟夫问题


    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

    import java.util.Scanner;  
      
    /** 
     * 循环列表的Java实现,解决约瑟夫环问题 
     */  
    public class YueSeFuHuan  
    {  
        //定义结点,必须是static  
        static class Node  
        {  
            int data;  
            Node next;  
            Node(int arg1)  
            {  
                this.data = arg1;  
            }  
        }  
        public static void main(String[] args)  
    
        {
            
             
          int n = 0,m = 0;//定义总人数n,和出圈数字m  
          //输入n和m  
          System.out.println("输入总人数n,出圈数字m");  
          Scanner scanner = new Scanner(System.in);  
          n = scanner.nextInt();//数组大小  
          m = scanner.nextInt();// sp num  
          
          Node head=new Node(1);
          
          Node p=head;
          for(int i=2;i<=n;i++)
          {
              Node current=new Node(i);
              p.next=current;
              p=current;
              
          }
          p.next=head;//尾接头形成循环链表(p为尾结点)  
          
       
         
          while(p!=p.next)//当只存在p一个节点时 退出   
          {
              //要删除某节点 要找到该节点之前的那个节点
              
              for(int i=1;i<m;i++)
                 p=p.next;//向后移m-1 次 即可得到 此时的p指向 应删除节点的前一个节点
              
              
              System.out.println("此时删除:"+p.next.data);
              p.next=p.next.next;
              
          }
          
          System.out.print("
    幸运者是:"+p.data);
            
        }
     
          
    }  

    结果:

    输入总人数n,出圈数字m
    5 3
    此时删除:3
    此时删除:1
    此时删除:5
    此时删除:2
    
    幸运者是:4
  • 相关阅读:
    hduoj1285确定比赛名次
    HDU 1041 Computer Transformation 数学DP题解
    使用Git【转】
    Git-标签管理【转】
    Git-分支管理【转】
    Git-远程仓库【转】
    Git-时光穿梭【转】
    创建版本库【转】
    安装Git【转】
    Git简介【转】
  • 原文地址:https://www.cnblogs.com/xiaodeyao/p/5301805.html
Copyright © 2020-2023  润新知