1 /*约瑟夫环的实现*/ 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 6 #define SIZE 10 7 #define STEP 5 8 9 void initArray(int arr[SIZE]); 10 void joseph_1(); 11 void joseph_2(); 12 13 int main() 14 { 15 joseph_2(); 16 return 0; 17 } 18 19 void initArray(int arr[SIZE]) 20 { 21 int i; 22 for(i = 0; i < SIZE; i++) 23 arr[i] = i+1; 24 } 25 26 /*建立一个SIZE个元素的循环数组,从数组头开始遍历并计数, 27 *如果计数i == STEP则剔除元素,继续循环, 28 *当当前元素与下一个元素相同时退出循环。 29 * */ 30 void joseph_1() 31 { 32 int count;//计数 33 int next;//下一个数数元素的下标 34 int move;//删除一个元素后,其后的元素前移的工作指针 35 int currentNum;//记录剩下的元素个数 36 int arr[SIZE]; 37 38 next = 0; 39 currentNum = SIZE; 40 initArray(arr); 41 42 while(currentNum != 1) 43 { 44 count = 1; 45 while(count != STEP) 46 { 47 //到达最右端 48 if(next + 1 == currentNum) 49 next = 0; 50 else 51 next++; 52 count++; 53 } 54 //打印出队的元素 55 printf("%2d->",arr[next]); 56 //next后的元素前移 57 for(move = next + 1; move < currentNum; move++) 58 arr[move-1] = arr[move]; 59 //如果剔除的所最有端元素,下一个数数的元素应该所第一个,否则不变 60 if(next + 1 == currentNum) 61 next = 0; 62 currentNum--; 63 } 64 printf("\nThe winner is :%d\n",arr[0]); 65 } 66 //将数到的元素置零,只需找到最后一个非零元素即可 67 void joseph_2() 68 { 69 int i;//工作指针 70 int count;//计数 71 int currentNum;//记录剩下的元素个数 72 int next; 73 int arr[SIZE]; 74 75 count = 0; 76 next = 0; 77 currentNum = SIZE; 78 initArray(arr); 79 80 while(currentNum != 1) 81 { 82 if(arr[next] != 0) 83 { 84 count++; 85 if(count == STEP) 86 { 87 printf("%2d->",arr[next]); 88 arr[next] = 0; 89 count = 0; 90 currentNum--; 91 } 92 else 93 next = (next + 1) % SIZE; 94 } 95 else 96 next = (next + 1) % SIZE; 97 } 98 //找到最后一个非零元素 99 for(i = 0; i < SIZE; i++) 100 if(arr[i] != 0) 101 printf("\nThe winner is:%d\n",arr[i]); 102 }
时间: 2024-10-16 16:16:48