码迷,mamicode.com
首页 > 编程语言 > 详细

约瑟夫环的数组实现

时间:2015-04-11 20:40:09      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

约瑟夫环的数组实现

  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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!