约瑟夫环的数组实现

  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

约瑟夫环的数组实现的相关文章

约瑟夫环_java_数组

package test;import java.util.Scanner;//键盘输入/** public class test{ public static void main(String[] args){ //提示输入总人数 System.out.println("请输入做这个游戏的总人数:"); Scanner sca=new Scanner(System.in); int m=sca.nextInt(); //提示输入要出圈的数值 System.out.println(&q

约瑟夫环的C语言数组实现

约瑟夫环问题的具体描述是:设有编号为1,2,--,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,知道剩余1个人为止.当任意给定n和m后,设计算法求n个人出圈的次序. 一开始看到这这个题目就是觉得这是一个环形的,想到了用链表和用指针,然后看题目的要求是使用数组实现.就先暂时放弃用链表的办法,用数组实现之后再用链表来实现. 一开始的思路是: 1.建立一个长度为n的数组. 2.取出位置编号

C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这个游戏:按这样的规则,剩下一个人,游戏就结束,这个人就为赢家.(读者可以试着表达,不认同,直接忽略) 抽象分析 这个人就是一个数据个体,数据结点,数据元素.上面产生的数据结构为:单方向循环的链.可以用链表实现,也可以用数组来实现. 链表到数组的迁移 人(数据元素. 数据结点.数据个体) 结点关系 (

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

约瑟夫环问题的两种实现[链表+数组]

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 以下是使用循环链表和数组的两种实现: 1 #include<iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int data; 7 Node *next; 8 }; 9 void CreateLink

C语言用数组解决约瑟夫环问题

       在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?         用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题.采用循环链表的方法,以后详述.本节主

约瑟夫环问题——初步了解+数组实现

约瑟夫环问题--初步了解+数组实现 一开始接触约瑟夫环问题,还是在C语言的书中,具体的题目如下:n个人围坐成一圈,选某个人开始(比如第1个),从1开始报数,沿着顺时针方向数到m的人被淘汰,然后后面一个人继续再从1开始报数,数到m时再淘汰一人.重复上面的过程,输出剩下的最后一个人. 解题思路: Step 1:建立一个长度为n的数组: Step 2:删除的位置编号为i = (i + m -1) % n; 为什么呢?因为第一个人事i = 0,然后 i 增加m-1即可删除另外一个人,把数组想象成一个"环

j使用数组实现约瑟夫环 java

我们首先来看一下约瑟夫环问题: 给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号. 思路: 建立一个长度为m+1的数组,将其的内容初始化为0至m 我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利. 变量j为判断当前元素是否为排列的第n个元素,如果是则将当前下标为i的元素的值置为0,不是的话,i++,j++,每当我们遍历到数值为0的

小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法

约瑟夫环的链表解法.数组解法和数学公式解法 约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义.约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难.在那里,这些叛乱者表决说"要投降毋宁死".于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的.约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品