首页 > 代码库 > Java学习之约瑟夫环的两中处理方法
Java学习之约瑟夫环的两中处理方法
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 }
Java学习之约瑟夫环的两中处理方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。