前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java学习之约瑟夫环的两中处理方法

Java学习之约瑟夫环的两中处理方法

作者头像
Gxjun
发布2018-03-26 15:47:25
7200
发布2018-03-26 15:47:25
举报
文章被收录于专栏:mlml
代码语言:javascript
复制
 1 package day_2; 
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * @author Administrator
 7  *  约瑟夫环问题:  设编号为 1,2,3,....n的N个人围坐一圈,约定编号为k(1<=k<=n)
 8  *  的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次
 9  *  类推,直到所有人出列为止,由此产生一个出队编号的序列。
10  *  方法一:数组取模法、(模拟)
11  */
12 
13 public class Demo_1 {
14     public static void main(String args [])
15     {
16       int n,m;
17       Scanner cin;
18       while(true)
19       {
20           cin = new Scanner(System.in);
21           n=cin.nextInt();
22           m=cin.nextInt();
23           if( 0==n+m ) break;
24            fun_2(n,m);
25       }
26        // cin.close();
27        }
28     //方法一: 数组模拟
29  static void fun_1(int n ,int m){
30         boolean [] arr = new boolean [n+1];
31         for(int i=0;i<=n;i++)
32              arr[i]=true;
33         //双亲数组法
34          int  pos=1;
35          m--;
36        while(true){
37           int cnt=pos;
38           while(!arr[(pos+m)%(n+1)==0?1:(pos+m)%(n+1)]){
39                   ++pos;
40           if(pos-cnt>=n)    return ;
41           }
42           pos=(pos+m)%(n+1)==0?1:(pos+m)%(n+1);
43            arr[pos]=false;
44           System.out.println(pos);
45           ++pos;
46        }       
47     }
48  
49  /**
50  *  方法二: 循环链表模拟 
51  */
52 static void fun_2(int n , int m){    
53     class child{    
54         int id ;
55         child  next ;
56         public child(){};
57         int getId() {
58             return id;
59         }
60         child getNext() {
61             return next;
62         }
63     } ;
64     
65   //模拟c循环链表    
66    child head,a;
67     a = new child() ;
68     a.id = 1 ;
69     head = a ;  
70     for(int i=2 ; i<=n ; i++ ){
71          child b = new child() ;
72             b.id = i ;
73          head.next = b ;
74         head = b ;
75     }
76       head.next = a;
77     while(a!=a.next){
78         child b=head.next;
79       for(int i=1; i<m ;i++ ){
80           b=a; 
81           a=a.next; 
82       }
83      System.out.println(a.id);
84           a=a.next;
85           b.next=a;
86           System.gc();
87     }
88     if(m>1) System.out.println(a.id);
89 }
90 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-11-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档