求高手指教.急.......

时间:2022-09-29 23:41:27
设有n个人围坐一圈并按顺时针方向从1到n编号, 从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数, 如此进行下去直到所有的人都出圈为止。
现要求按出圈次序, 每10人一组, 给出这n个人的顺序表

9 个解决方案

#1


http://www.156ok.com/bbs/problem_list.asp?id=11088

#2


首尾相接的连~~~

#3


约瑟夫环,作业帖……

#4


好象又不是,更简单点儿……

#5


说简单你倒是做啊.不帮忙跑来吹什么.

#6


约瑟夫环的问题,好像钱能的书上有这部分的例子,可以看一下。。。。

#7


《C语言习题集》里有跟这个题目相类似的题目,好象在第5章,自己去看

#8


编号为1,2,。。n的n个人按顺时针方向围坐一圈。每人持有一个密码(正整数)。一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报道m是停止报数,保m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数。如此下去, 直至所有人全部出列位置,设计一个程序求出出列顺序。

struct lnode {
       elemtype data;   //值域
       lnode* next;    //指针域
}c_list;
/*建表*/
void create(c_list *hl);/*按要求读入n个数建表*/
/*显示结点值*/
void display(c_list *hl);
/*从循环链表中删除元素*/
void DeleteList(c_list* HL);
/*上面的我就不做了*/
void JSC(int n,int m)
{
  int count=1;
  struct  *head,*p,*q;
  create(head);
  p=head;
  while(p)
  {
    q=p->next;
    if(count==m)
    { 
      display(p);
      delectlist(p);
      count=1;
      p=q;
    }
    else
      {
        count++;
        p=p->next;
      }
  }    


#9


/* 约瑟夫环 */
#include <stdlib.h>
#include <stdio.h>


typedef struct ENode
{
int Number;
int Cipher;
struct ENode *next;
}enodetype;
void CreateLink(enodetype *head);
void display(enodetype *head);
void DeleteOrder(enodetype *head, int m, int N);
const int N = 7;

int main(int argc, char* argv[])
{

enodetype *head = NULL;
head = (enodetype *)malloc(sizeof(enodetype));
if( head == NULL )
{
printf("内存分配失败!\n");
return 0;
}
head->Number = head->Cipher =0;
head->next = head;

CreateLink(head);
display(head);
int m=20;
DeleteOrder(head,m,N);

printf("\nHello World\n");

return 0;
}

void CreateLink(enodetype *head)
{
int Cipher[N] = {3,1,7,2,4,8,4};
int i=0;

enodetype *p,*newnode;
p = head;
for( i=1; i<=N; i++)
{
newnode = (enodetype *)malloc(sizeof(enodetype));
if( newnode == NULL )
{
printf("内存分配失败!\n");
return ;
}
newnode->Number = i;
newnode->Cipher = Cipher[i-1];

p->next = newnode;
p = newnode;
}
p->next = head->next;//尾结点的指针指向第一个结点.
}

void display(enodetype *head)
{
int i=0;
enodetype *p = head->next ;

printf("显示各结点的编号和密码!\n");
if( p == NULL )
{
printf("The link is Empty\n");
return;
}
// for( i=0; i<N; i++)
do{
printf("cipher[%d] = %d ",p->Number ,p->Cipher );
p = p->next ;
}while( p != head->next);
printf("\n");
}

void DeleteOrder(enodetype *head, int m,int N)
{
int i,j;
enodetype *p ,*q=head;

for( i=0; i<N; i++)q = q->next ;

for( i=0; i<N; i++)
{
p = q;
for( j=0; j<m; j++)
{
q = p;
p = p->next ;
}
q->next = p->next ;
m = p->Cipher;
printf("(%d,%d)",p->Number,m);
free(p);
}

}



#1


http://www.156ok.com/bbs/problem_list.asp?id=11088

#2


首尾相接的连~~~

#3


约瑟夫环,作业帖……

#4


好象又不是,更简单点儿……

#5


说简单你倒是做啊.不帮忙跑来吹什么.

#6


约瑟夫环的问题,好像钱能的书上有这部分的例子,可以看一下。。。。

#7


《C语言习题集》里有跟这个题目相类似的题目,好象在第5章,自己去看

#8


编号为1,2,。。n的n个人按顺时针方向围坐一圈。每人持有一个密码(正整数)。一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报道m是停止报数,保m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数。如此下去, 直至所有人全部出列位置,设计一个程序求出出列顺序。

struct lnode {
       elemtype data;   //值域
       lnode* next;    //指针域
}c_list;
/*建表*/
void create(c_list *hl);/*按要求读入n个数建表*/
/*显示结点值*/
void display(c_list *hl);
/*从循环链表中删除元素*/
void DeleteList(c_list* HL);
/*上面的我就不做了*/
void JSC(int n,int m)
{
  int count=1;
  struct  *head,*p,*q;
  create(head);
  p=head;
  while(p)
  {
    q=p->next;
    if(count==m)
    { 
      display(p);
      delectlist(p);
      count=1;
      p=q;
    }
    else
      {
        count++;
        p=p->next;
      }
  }    


#9


/* 约瑟夫环 */
#include <stdlib.h>
#include <stdio.h>


typedef struct ENode
{
int Number;
int Cipher;
struct ENode *next;
}enodetype;
void CreateLink(enodetype *head);
void display(enodetype *head);
void DeleteOrder(enodetype *head, int m, int N);
const int N = 7;

int main(int argc, char* argv[])
{

enodetype *head = NULL;
head = (enodetype *)malloc(sizeof(enodetype));
if( head == NULL )
{
printf("内存分配失败!\n");
return 0;
}
head->Number = head->Cipher =0;
head->next = head;

CreateLink(head);
display(head);
int m=20;
DeleteOrder(head,m,N);

printf("\nHello World\n");

return 0;
}

void CreateLink(enodetype *head)
{
int Cipher[N] = {3,1,7,2,4,8,4};
int i=0;

enodetype *p,*newnode;
p = head;
for( i=1; i<=N; i++)
{
newnode = (enodetype *)malloc(sizeof(enodetype));
if( newnode == NULL )
{
printf("内存分配失败!\n");
return ;
}
newnode->Number = i;
newnode->Cipher = Cipher[i-1];

p->next = newnode;
p = newnode;
}
p->next = head->next;//尾结点的指针指向第一个结点.
}

void display(enodetype *head)
{
int i=0;
enodetype *p = head->next ;

printf("显示各结点的编号和密码!\n");
if( p == NULL )
{
printf("The link is Empty\n");
return;
}
// for( i=0; i<N; i++)
do{
printf("cipher[%d] = %d ",p->Number ,p->Cipher );
p = p->next ;
}while( p != head->next);
printf("\n");
}

void DeleteOrder(enodetype *head, int m,int N)
{
int i,j;
enodetype *p ,*q=head;

for( i=0; i<N; i++)q = q->next ;

for( i=0; i<N; i++)
{
p = q;
for( j=0; j<m; j++)
{
q = p;
p = p->next ;
}
q->next = p->next ;
m = p->Cipher;
printf("(%d,%d)",p->Number,m);
free(p);
}

}