求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!!!!!

设有n个人围坐在圆桌周围,现从某个位置m(1≤m≤n)上的人开始报数,报数到k的人就站出来。下一个人,即原来的第k+1个位置上的人,又从1开始报数,再报数到k的人站出来。依此重复下去,直到全部的人都站出来为止。试设计一个程序求出列序列。
请输入围坐在圆桌周围的人数n:7

请输入第一次开始报数人的位置m:3

你希望报数到第几个数的人出列k: 2

出列的顺序如下:4 6 1 3 7 5 2

他们都是用链表做的。。我没用链表做。。。很简单的写了一个。。。

#include <iostream.h>

void Fmade(int x, int y, int z);

void main()

{

 int a, b, c;

 //t i, j, k;

 //t aa[100], b[100];

 cout<<"请输入总人数:";

 cin>>a;

 cout<<endl<<"请输入开始位子:";

 cin>>b;

 cout<<endl<<"请输入步长:";

 cin>>c;

 Fmade(a, b, c);

}

void Fmade(int x, int y, int z)

{

 int i, j=0, k=0;

 int aa[100], bb[100];

 int start;

 aa[0]=0;

 

 for(i=1; i<=x; i++)

 {

  aa[i]=i;

 }

 start=y;

 while(j < x)

 {

  while(start <= x)

  {

   if(aa[start] !=0)

   {

       k++;

   }

      if(k == z)

   {

       bb[j]=aa[start];

       aa[start]=0;

       j++;

       k=0;

   }

   start++;

  }

     start=1;

 }

 cout<<"出列顺序为:";

    for(i=0; i<x; i++)

 {

  cout<<bb[i]<<"   ";

 }

}

说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。

最够插入运算的答案的图片:

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-12-27

他们都是用链表做的。。我没用链表做。。。很简单的写了一个。。。
#include <iostream.h>
void Fmade(int x, int y, int z);
void main()
{
 int a, b, c;
 //t i, j, k;
 //t aa[100], b[100];
 cout<<"请输入总人数:";
 cin>>a;
 cout<<endl<<"请输入开始位子:";
 cin>>b;
 cout<<endl<<"请输入步长:";
 cin>>c;
 Fmade(a, b, c);
}
void Fmade(int x, int y, int z)
{
 int i, j=0, k=0;
 int aa[100], bb[100];
 int start;
 aa[0]=0;
 
 for(i=1; i<=x; i++)
 {
  aa[i]=i;
 }
 start=y;
 while(j < x)
 {
  while(start <= x)
  {
   if(aa[start] !=0)
   {
       k++;
   }
      if(k == z)
   {
       bb[j]=aa[start];
       aa[start]=0;
       j++;
       k=0;
   }
   start++;
  }
     start=1;
 }
 cout<<"出列顺序为:";
    for(i=0; i<x; i++)
 {
  cout<<bb[i]<<"   ";
 }
}
说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。
最够插入运算的答案的图片:

第2个回答  2020-01-09
他们都是用
链表
做的。。我没用链表做。。。很简单的写了一个。。。
#include <iostream.h>
void Fmade(int x, int y, int z);
void main()
{
int a, b, c;
//t i, j, k;
//t aa[100], b[100];
cout<<"请输入总人数:";
cin>>a;
cout<<endl<<"请输入开始位子:";
cin>>b;
cout<<endl<<"请输入步长:";
cin>>c;
Fmade(a, b, c);
}
void Fmade(int x, int y, int z)
{
int i, j=0, k=0;
int aa[100], bb[100];
int start;
aa[0]=0;

for(i=1; i<=x; i++)
{
aa[i]=i;
}
start=y;
while(j < x)
{
while(start <= x)
{
if(aa[start] !=0)
{
k++;
}
if(k == z)
{
bb[j]=aa[start];
aa[start]=0;
j++;
k=0;
}
start++;
}
start=1;
}
cout<<"出列顺序为:";
for(i=0; i<x; i++)
{
cout<<bb[i]<<" ";
}
}
说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。
最够插入运算的答案的图片:
第3个回答  2009-11-26
//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int data;
struct node *next;
} node;

node *init(int n) /*创建包含从1到n结点的循环链表*/
{
int i;
node *a,*b,*rt=NULL;

for (i = 0,a=rt=malloc(sizeof(node)); i<n; i++) {
if (!i) {
a->data=1;
a->next=NULL;
}
else {
b=malloc(sizeof(node));
b->next=NULL;
b->data=i+1;
a->next=b;
a=b;
}
}
a->next=rt;
return rt;
}
void prt(node *a,int b,int n) /*从第b个人开始数,数到n者出列*/
{
node *p=a,*fr=a,*de;
int i;

--b;
while (b--)
p=p->next ;
while (fr->next!=p)
fr=fr->next ;
while (p->next!=p)
{
i=n-1;
while (p->next!=p&&i--) {

p=p->next;
fr=fr->next ;

}
printf("%d\t",p->data);
de=p ;
fr->next=fr->next->next;

p=p->next;
free(de);

}
printf("%d\n",p->data );
free(p);
}
int main(void) /*测试*/
{

node *list=init(7);/*共有7个人*/
prt(list,3,2); /*从第3个人开始数,数到2者出列*/

return 0;
}
//---------------------------------------------------------------------------

求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!
void Fmade(int x, int y, int z);void main(){ int a, b, c;\/\/t i, j, k;\/\/t aa[100], b[100];cout<<"请输入总人数:";cin>>a;cout<<endl<<"请输入开始位子:";cin>>b;cout<<endl<<"请输入步长:";cin>>c;Fmade(a, b, c);} void Fmade(int x, int y, i...

用循环队列实现约瑟夫环处理.若干人循环报数,凡报到3的倍数退出,最后剩...
\/\/ 首先确认n个人,并打上标记 int n = 10;\/\/ 退出的报数数字 int say = 3;Queue<Integer> qu = new LinkedList<Integer>();for (int i = 0; i < n; i++) { qu.add(i + 1);} \/\/ 开始报数技术 int j = 1;int lastMan = 0;while (qu.size() > 0) { lastMan = qu...

c++问题小孩出列 求助!谢谢 我用n=90 s=7 m=5测试 得出的结果一到了8...
while(total > 0 )\/\/总有效人数,while循环条件 { while(k<m){ if(children[j]==0)\/\/为零表示以退出环,不计 { j++;if(j>n-1)\/\/循环队列思想 j = j%n;} else { j++;if(j>n-1 && k!=m-1) \/*k 若等于m-1 则下次必跳出循环,j暂时不能求余,因为要用到j的值 *\/ ...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

敢死队问题 C\/C++
这是个约瑟夫环逆问题 推导是这样的:为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(...

用循环队列实现约瑟夫环处理。若干人循环报数,凡报到3的倍数退出,最后...
\/\/ 首先确认n个人,并打上标记 int n = 10;\/\/ 退出的报数数字 int say = 3;Queue<Integer> qu = new LinkedList<Integer>();for (int i = 0; i < n; i++) { qu.add(i + 1);} \/\/ 开始报数技术 int j = 1;int lastMan = 0;while (qu.size() > 0) { lastMan = qu...

相似回答