哪位能提供用C语言解决的约瑟夫问题程序 需要详细步骤解答 我是个菜鸟 望多多指教

2024-12-02 23:24:05
推荐回答(4个)
回答1:

很关键的是我给你的这个网址,哪里有调整的源代码
///////////////////////////////////////////////
约瑟夫问题
1、 问题描述 编号为 1,2,……,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数) 。一开 始任选一个正整数作为报数上限值 m, 从第一个人开始按顺时针方向自 1 开始顺序报数, 报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上 的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序 求出出列顺序。 2、 数据结构设计 n 个人围圈,形成线性关系;处理为逐个删除,故用链式结构合适;又人员围成圆圈, 所以此链式结构采用循环方式较好;排号按照一个方向进行,故数据结构采用带头结点 的单向循环链表。假设人员以首次的编号命名,对每个人员采用编号和密码加以描述。 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 #include using namespace std;
typedef struct node { int no; int key; struct node *next; }node,*LinkList;
LinkList CreateList(int *tt,int nn) { LinkList h = (node*)malloc(sizeof(node)); h->next = h; node *p,*q; p=h; for(int i1 = 0;i1no = i1+1; q->key = tt[i1];
p->next = q; p = q; } p->next = h; p = NULL; q = NULL; return h; }
void DeleteList(LinkList pre) //pre 为要删除节点的前一个节点 { LinkList m; m = pre->next; pre->next = pre->next->next; free(m); m = NULL; }
void run(LinkList L,int kk) { int z = kk; LinkList x = L; int ct = 0; while(L->next != L) { for(ct = z-1;ct>0;ct--) //使 x 指向要删除节点的前一个节点 { if(x->next == L) { x = L; } x = x->next;
} if(x->next == L) { x = L; } cout<next->no<<" "; z = x->next->key; DeleteList(x); } }
void main() { int k,n; cout<<"输入第一个密码:"<>k; cout<<"输入人数:"<>n; int *t; t = new int[n]; cout<<"输入 "<>t[i]; } LinkList list = CreateList(t,n); run(list,k); delete [] t; system(“pause”); }

回答2:

一维数组轻松解决
//功能:解决约瑟夫问题
#include
#define N 9
#define K 2
#define M 3

//给数组赋值
void setDate(int a[],int n)
{ int i;
for(i=0;i a[i]=i+1;
}
//删除被选中的孩子
void deleted(int a[],int m,int len)
{
int i=m;
do
{
a[i]=a[i+1];
i++;
}while(i}

//开始play
void play(int a[],int k,int m)
{
int len =N;
int dm=k+m-2;//第一个被剔除的孩子
while(len!=1)
{printf("第%d个孩子被剔除。\n",a[dm]);
deleted(a,dm,len);//将被剔除的孩子从数组中删除
dm=dm+M-1;//下一个被剔除的孩子
len--;//数组的长度减1
if(dm>=len) dm=dm-len;
}
printf("最后一个孩子是%d.",a[0]);//最后一个孩子被放在a[0]中
}
main()
{
int a[N];
setDate(a,N);
play(a,K,M);

}

回答3:

代码如下
提示:程序运行后首先要求用户指定初始报数上限。然后读取各人的密码。设

n<30。

typedef struct node
{
int num,code;
struct node *next;
}lnode;
void main()
{
int i,j,key,n; /*i,j为记数器,key为输入的密码,n为人的总个数*/
lnode *p,*s,*head;
head=(lnode *)malloc(sizeof(lnode)); /*为头结点分配空间*/
p=head;
printf("Please enter the num of the person:"); /*输入人的总个数*/
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Person %d",i);
printf(" code: ");
scanf("%d",&key); /*输入各个人的密码*/
s=p;
p=(lnode *)malloc(sizeof(lnode)); /*创建新的结点*/
s->next=p;
p->num=i;
p->code=key;
}
p->next=head->next;
p=head;
head=head->next;
free(p);

p=head;
do
{
printf("\nPerson%d Code:%d",p->num,p->code); /*输出链表*/
p=p->next;
}while(p!=head);

printf("\nPlease enter your first key:"); /*输入第一个数*/
scanf("%d",&key);
do
{
j=1; /*j为记数数*/
p=head;
while(j{
s=p;
p=p->next;
j++;
}
i=p->num;
key=p->code;
printf("\nThe out of the num:");
printf("Person%d",i);
s->next=p->next;
head=p->next; /*重新定义head,下次循环的开始结点*/
free(p);
n--; /*每循环一次人是减1*/
}while(n>0);
getch();
}

回答4:

#include
#include
typedef struct Node{
int num;
int password;
struct Node *next;
}JosephNode;
JosephNode *creatNode(int num){
int i;
JosephNode *head,*tail;
tail=(JosephNode*)malloc(sizeof(JosephNode));
head=tail;
for(i=1;i tail->num=i;
printf("请输入第%d号的密码:",i);
scanf("%d",&tail->password);
tail->next=(JosephNode*)malloc(sizeof(JosephNode));
tail=tail->next;
}
tail->num=i;
printf("请输入第%d号的密码:",i);
scanf("%d",&tail->password);
tail->next=head;
return head;
}
void Joseph(JosephNode*head,int M){
int i,j=1;
JosephNode*p,*q;
p=head;
M--;
while(p->next!=p){
for(i=1;i p=p->next;
q=p->next;
p->next=q->next;
M=q->password;
printf("\n第%d个出局的人的编号是:%d\t 密码是:%d",j,q->num,q->password);
j++;
free(q);
}
p=p->next;
printf("\n第%d个出局的人的编号是:%d\t 密码是:%d\n",j,p->num,p->password);
}
void main(){
int numbers,M;
JosephNode*head;
printf("输入人数和起始M值:\n");
scanf("%d,%d",&numbers,&M);
head=creatNode(numbers);
printf("输入结果如下\n");
Joseph(head,M);
}
这个程序我也是刚做~~都调试好了,可以正常运行~~~