您现在的位置是:结局
约瑟夫图片,约瑟夫问题:M个人围成一圈,从第一个人开始依次从1
2020-11-09 13:31结局
简介代本:#include "stdio.h"#include

代本:
#include "stdio.h"
#include <stdlib.h>
struct s{
char x;
struct s *next;
};
void dellink(struct s *p){
struct s *q,*t;
for(t=p,q=p->next;q!=t;q=q->next){//释放链表
free(p);
p=q;
}
}
int main(int argc,char *argv[]){
struct s *p,*head;
int n,m,i,k,t;
printf("Enter n, m(int n,m>0)...\n");
if(scanf("%d%d",&n,&m)==2 && m>0 && n>0){//输人数数间隔
if((p=head=(struct s *)malloc(sizeof(struct s)))==NULL){//申请空间
printf("Application memory failure, exit...\n");//申请失败则退出
return 0;
}
for(p->next=head,p->x=i=1;i<n;i++){//链表结点置1并构成环链表
if(p->next=(struct s *)malloc(sizeof(struct s))){
p=p->next;
p->x=1;
p->next=head;//构成环链表就把最后结点的下一结点设为第一个结点
}
else{//若某结点申请失败则释放已申请结点并退出
printf("Application memory failure, exit...\n");
dellink(head);//释放已申请结点
return 0;
}
}
for(i=1,t=k=0,p=head;k<n;p=p->next,++t)//按题设次序对前n个结点清0
if(p->x && i++%m==0)
p->x=0,k++;
printf("%d\n",t%n);//输出最后清0的编号
dellink(head);//释放整个链表
return 0;
}
else
printf("Input error, exit...\n");
return 0;
}
-下面是更多关于约瑟夫图片的问答
约瑟夫问题 设有N个人围坐一圈,现从某人开始报数, 数到M的人出列,接着从出列的下一个人重新报数,数到M的人又出列,如此下去直到所有人都出列为止,试给... 让你用程序实现过程就好了吗,管他要求啥 #include "stdio.h"#define M 65int main(){ int i,k,n,m,count; int name[M]; scanf ("%d %d",&n,&m);// n个人 for (i = 0;i < n;i ++)//编号 { name[i]= i +1; } k = 0; for (i = 0;i < n;i ++) { count = 0; while (count < m) //每到m个人入 { while (name[k] == 0) k = (k + 1)%n; count ++; k = (k + 1)%n; } k --; if (k < 0) k = n-1; printf ("%d\n",name[k]); name[k] = 0; } return 0;}哪里不明白,就来啊 #include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1typedef int Status;typedef double ElemType;//-----------------------------------//单向链typedef struct LNode{int number;int data;struct LNode *next;}LNode, *LinkList;//-----------------------------------LinkList EvaluList(int n);//对单向循环链表进行尾插入赋值int size(LinkList L);//求链表的个数Status ScanList(LinkList L);//遍历单向循环链表Status Joseph(LinkList &L,int m);//约瑟夫环的实现 本回答被网友采纳 #include <iostream>using namespace std;////////////////////////////////////////////////////////////struct player{ //定义一个成员结构 int num; //编号 int key; //密码 player *next; //指向下一个player节点的指针};player *circle(player *,int &m); //创建一个单循环链表的函数void begin_to_count(player *,player *,int); //运算和输出函数void Q(); //问题描述的函数/////////////////////////////////////////////////////////////void main(){ int start_key; player *head; player *last; last=NULL; head=new player; Q(); last=circle (head,start_key); begin_to_count(head,last,start_key); return;}/////////////////////////////////////////////////////////////player *circle(player *head, int &start_key){ //从键盘读入数据 并建立单循环链表函数 int m,i; player *p,*Last; p=head; cout<<"请输入人数"<<ends; cin>>m; cout<<"请输入这"<<m<<"个人的密码(用空格隔开)"<<endl; for (i=0;i<m;i++) { p->num=i+1; cin>>p->key; Last=p; p->next=new player; p=p->next; } delete p; Last->next=head; cout<<"请输入初始密码"<<ends; cin>>start_key; return Last;}////////////////////////////////////////////////////////////////void begin_to_count(player *head,player *last,int m){ //输出函数 player *P; int i; cout<<"输出序列为:"<<ends; while (head->next!=head) { for (i=1;i<m;i++) { last=head; head=head->next; } P=head; m=head->key; cout<<P->num<<ends; head=head->next; last->next=head; delete P; } if (head->next==head){ cout<<head->num<<endl; delete head; } // else // begin_to_count(head,last,i); return;}void Q(){ //打印约瑟夫环信息的函数 cout<<" ==============约瑟夫环==========="<<endl <<endl <<"约瑟夫(Joseph)问题的一种描述是:"<<endl <<"编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。" <<"一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报" <<"到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始" <<"重新从1报数,如此下去,直到所有人全部出列为止。"<<endl <<endl;} 约瑟夫(Joeph)问题的一种描述是:为1,2,…,n的n个人按顺时针围坐一圈,每人持有一个密码(正整数一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。1.需求分析和说明 分析约瑟夫问题:n个人围成圈,每人各持一个密码,任选一个正整数作为报数上限值m,从第一个人开始,数到第m个人,删除并以出列者密码作为新的m值,从下一个人开始进行第二轮操作,直到所有人都出列。例如n=6, m=3, 处理过程下图。2.设计 n个人围圈,形成线性关系;处理为逐个删除,故用链式结构合适;又人员围成圆圈,所以此链式结构采用循环方式较好;排号按照一个方向进行,故数据结构采用带头结点的单向循环链表。假设人员以首次的编号命名,对每个人员采用编号和密码加以描述。利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。存储结构: typedef struct Node { ElemType date; //编号 int mima; //密码 struct Node *next; }Node,*LinkList; 单向循环链表:LinkList H; //表头指针Node *Q,*Pre;//*Q指新建结点,*pre指向当前工作结点Q=(Node*)malloc(sizeof(Node)); 构造函数:void InitList(LinkList *H); //初始化循环链表void InPut(LinkList H,int *A);//插入结点void DelList(LinkList H,int *x, int*a); //删除结点 #include<iostream.h>struct Node{ int data; Node *pNext;};void main(){ int n,k,m,i; Node *p,*q,*head; cout<<"输入n:"; cin>>n; cout<<"输入起始报数人k的值:"; cin>>k; cout<<"输入 数到m出列的m的值:"; cin>>m; 本回答被网友采纳Tags:约瑟夫图片,C语言:n人围圈m报数的约瑟夫老题,要求见图片,
相关文章
随机图文
养父大结局,养父苦了一辈子到最后.........
三个家庭组成了一个大家庭,他们陪楼志军一起来到北京,在天安门前拍照片,然后就结束了 养父苦了一辈子到...唐嫣个人资料简介,唐嫣个人资料家世背景
唐1983年12月6日[1] 出生于上海市黄浦区籍浙江省宁波市,中地女演员。2006年毕业于戏剧学院表演系本科班。2...无心法师演员,无心法师的演职员表
《无心法师》是搜狐和影视联合出品,改编自作者尼罗作品的奇幻剧,由李国立任总监制,林玉芬、高林豹共同执...邪恶力量第十四季,现在还有什么app可以看美剧邪恶力量
说明CW认为邪恶力量的受众还是多的一B,12季我觉得挺没意思了,来来回回的和英国佬干,但CW续订13说明哪怕...