标签:
约瑟夫环的数组实现
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 }
标签:
原文地址:http://www.cnblogs.com/cpsmile/p/4418253.html