约瑟夫环问题求解算法C语言源代码

约瑟夫算法:n个人围成一圈,每人有一个各不相同的编号,选择一个人作为 起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈子缩小,然后从下一 个人继续从1到k数数,重复上面过程。求最后推出圈子的那个人原来的编号。

思路:按照上面的算法让人退出圈子,直到有n-1个人推出圈子,然后得到最 后一个退出圈子的人的编号。

程序:坐成一圈的人的编号不需要按序排列

#define N 100
int yuesefu1(int data[],int sum,int k)
{
   int i=0,j=0,count=0;
   while(count<sum-1)
   {
     if(data[i]!=0)/*当前人在圈子里*/
         j++;
     if(j==k)/*若该人应该退出圈子*/
     {
         data[i]=0;/*0表示不在圈子里*/
         count++;/*退出的人数加1*/
         j=0;/*重新数数*/
     }
     i++;/*判断下一个人*/
     if(i==sum)/*围成一圈*/
         i=0;
   }
   for(i=0;i<sum;i++)
      if(data[i]!=0)
          return data[i];/*返回最后一个人的编号*/
}

void main()
{
   int data[N];
   int i,j,total,k;
   printf("\nPlease input the number of every people.\n");
   for(i=0;i<N;)/*为圈子里的人安排编号*/
   {
      int input;
      scanf("%d",&input);
      if(input==0)
           break;/*0表示输入结束*/
      for(j=0;j<i;j++)/*检查编号是否有重复*/
          if(data[j]==input)
              break;
      if(j>=i&&input>0)/*无重复,记录编号,继续输入 */
      {
          data[i]=input;
          i++;
      }
      else
           printf("\nData error.Re-input:");
   }
   total=i;
   printf("\nYou have input:\n");
   for(i=0;i<total;i++)
   {
     if(i%10==0)
            printf("\n");
     printf("%4d",data[i]);
   }
   printf("\nPlease input a number to count:");
   scanf("%d",&k);
   printf("\nThe last one's number is %d",yuesefu1 (data,total,k));
}

时间: 2024-12-01 11:04:01

约瑟夫环问题求解算法C语言源代码的相关文章

常用算法:C#约瑟夫环问题

约瑟夫环问题,即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再出列,如此循环,直到所有人都出列为止.最后按出列顺序输出.代码如下: //从第start人开始计数,以alter为单位循环记数出列,总人数为total public int[] Jose(int total, int start,int alter) { int j, k = 0; //count数组存储按出列顺序的数据,以当结果返回 int[] count = new int[

利用简洁的C语言代码解决跳台阶问题与约瑟夫环问题_C 语言

跳台阶问题 题目: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级. 求总共有多少总跳法,并分析算法的时间复杂度. 分析: 也是比较基础的题目,通过递归可以方便的求解 代码实现如下(GCC编译通过): #include "stdio.h" #include "stdlib.h" int function(int n); int main(void) { int tmp; tmp = function(5); printf("%3d\n&q

bm算法-模式匹配中的BM算法的C语言源代码

问题描述 模式匹配中的BM算法的C语言源代码 用c实现BM算法,匹配字符串和匹配文本都是手动输入,然后输出是否在匹配文本中找到匹配字符串,结果一定要正确没bug.

c语言-C语言编程,约瑟夫环问题,用链表实现

问题描述 C语言编程,约瑟夫环问题,用链表实现 #include struct num { int n; struct num *p; } a[14]; int main() { struct num *pt; int i; for(i=0;i<14;i++) a.n=i; for(i=1;i<14;i++) a.p=&a[i+1]; a[13].p=&a[1]; pt=&a[1]; for(i=0;i<14;i++) printf("%5d"

C++循环链表之约瑟夫环的实现方法_C 语言

本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: #include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do

《C++语言基础》实践参考——Josephus(约瑟夫环)问题

返回:贺老师课程教学链接  项目要求 [项目-Josephus(约瑟夫环)问题]n个小孩子围成一圈,从第一个小孩子开始顺时针方向数数字,到第m个小孩子离开,这样反反复复,最终只剩下一个小孩子,求第几个小孩子留下?    提示:约瑟夫环即是一个首尾相连的链表,在建立好这个环以后,从头结点开始,每次间隔m孩子删除一个结点,直至只余下一个结点(删除了n-1个).     参考下面的代码,也可以自行设计类. //链表结点kid,其中number为这个人的编号 struct kid { int numbe

HDOJ 1443 约瑟夫环的最新应用分析详解_C 语言

k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同学,循环到队首继续报,并且如果一个同学报到的数是m,这个同学就出列,然后后面的同学继续从1开始报数,现在求一个数m,使k个女生全部出列,而男生没有出列. 输入:男生女生的个数k(男生女生人数相等都为k,输出:m值例: 输入:2,输出:7输入:4,输出:30 本题是约瑟夫环变形 先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%

约瑟夫环的问题

题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为1的小朋友开始报数.每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1...m报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到JOBDU名贵的"名侦探柯南"典藏版

php解决约瑟夫环示例

 这篇文章主要介绍了php解决约瑟夫环示例,需要的朋友可以参考下 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".)   猴子一群,都带着号码的,站好了一圈,数到m的枪毙,剩下的接着数.如此往复,死剩下的一个就疯了    代码如下: <?php function killMonkeys($monkeys, $m){     $k = $m;     while (count($monkey