1. 程式人生 > 其它 >【約瑟夫環】C語言陣列法+java迴圈連結串列法

【約瑟夫環】C語言陣列法+java迴圈連結串列法

 1 /**
 2     約瑟夫環:藉助陣列
 3     len:     表示人數
 4     target:  表示喊到該口號的出局。
 5     flag:    表示當前哥們喊的口號 範圍【1,2,3】
 6     default: 從1開始數
 7 **/
 8 int YSF(int len,int target,int start){
 9     int end = len+1;
10     int *a = (int*)malloc(sizeof(int)*end);
11     int i = 0,flag = 1,count = 0;
12 
13     //初始化陣列元素 都為0
14 for(;i<=len;i++) a[i] = 0; 15 16 //i作為遊標 17 i = start; 18 while(count != len-1){ 19 //當i游到最後一個元素的時候,應該繼續從第一個元素開始 20 if(i == end) i = 1; 21 if(a[i]!=1) { 22 if(flag > target) flag = 1; 23 if(flag == target) { printf("%d ",i); a[i] = 1
;count++; } 24 flag++; 25 } 26 i++; 27 } 28 putchar(10); 29 30 //遍歷陣列元素 找到那個值為0的元素,就是剩下的那個人 31 for(i = 1;i<=len;i++){ 32 if(a[i]==0) a[0] = i; 33 printf("%-2d",a[i]); 34 } 35 putchar(10); 36 return a[0]; 37 }
 1 //約瑟夫環
 2 public class
Main { 3 4 //定義連結串列節點型別 5 public static class Node{ 6 int data; 7 Node next; 8 } 9 10 //初始化迴圈連結串列資料 11 static Node initData(Node head){ 12 int[] arr = {1,2,3,4,5,6,7,8,9,10}; 13 Node tail = null; 14 for(int i:arr){ 15 Node node = new Node(); 16 node.data = i; 17 if(i==1) { 18 head = node; 19 tail = head; 20 } else { 21 tail.next = node; 22 tail = node; 23 } 24 } 25 tail.next = head; 26 return head; 27 } 28 29 //列印迴圈連結串列 30 static void printLK(Node head){ 31 Node p = head; 32 while(p.next!=head){ 33 System.out.print(p.data+" "); 34 p = p.next; 35 if(p.next==head) System.out.print(p.data+" "); 36 } 37 System.out.println(); 38 } 39 40 //模擬約瑟夫環過程 41 // p 當前節點 42 // pre 當前節點的前一個節點 43 // t 當前節點的後一個節點 44 static void YSF(Node head){ 45 Node pre=null,p,t=null; 46 p = head; 47 int flag = 1; 48 while(p.next!=p){ 49 if(flag==3){ 50 t = p.next; 51 pre.next = t; 52 p = t; 53 flag = 1; 54 } else { 55 pre = p; 56 p = p.next; 57 flag++; 58 } 59 } 60 System.out.println(p.data); 61 } 62 63 //主函式 64 public static void main(String[] args) { 65 Node head = null; 66 head = initData(head); 67 printLK(head); 68 YSF(head); 69 } 70 }