📄
字号:
// 约瑟夫.cpp : Defines the entry point for the console application.
//
//约瑟夫环问题
//约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。
//
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
int cipher;//密码
struct node * next;
}LNode,* LinkList;
void main()
{
LinkList R=NULL;
int n,k;
LinkList CreatList(int,LinkList);
void SelectMan(int,int,LinkList);
printf("输入总人数n和第一个报数k:");
scanf("%d%d",&n,&k);
R=CreatList(n,R);
SelectMan(n,k,R);
}
LinkList CreatList(int n,LinkList R)
{
LNode *p,*q;
int i,data;
R=q=(LNode *)malloc(sizeof(LNode));
for(i=1;i<n;i++){
p=(LNode *)malloc(sizeof(LNode));
q->num=i;
do{data=rand();}while(data==0);
data=abs(data);
data=data%10+1;
q->cipher=data;
q->next=p;
q=p;
}
do{data=rand();}while(data==0);//随机报数
data=abs(data);
data=data%10+1;
p->cipher=data;
p->num=n;
p->next=R;
R=p;
return R;
}
void SelectMan(int n,int k,LinkList R)
{
int i,j;
LNode *p,*q;
p=R;
for(i=1;i<n;i++){
for(j=1;j<k;j++)
p=p->next;
q=p->next;
k=q->cipher;//报密码
p->next=q->next;
printf("%4d:%2d",q->num,q->cipher);
if(i%5==0)printf("\n");
free(q);
}
printf("%4d:%2d",p->num,p->cipher);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -