go语言约瑟夫环问题 链表实现约瑟夫环C语言

0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个'>约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个

共有三种解法:我先给你一个同密码,循环链表写的吧!

在炎陵等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都做网站 网站设计制作按需制作网站,公司网站建设,企业网站建设,品牌网站制作,成都营销网站建设,外贸营销网站建设,炎陵网站建设费用合理。

欢迎采纳并追问!

#include stdio.h

#include stdlib.h

int linktype(int n,int m) //链表结构

{

int people,passord;

struct node

{

int data;

struct node *next;

}NODE;

node *p,*head,*q,*pri;

head=(node *)malloc(sizeof(struct node));//创建一个空表

head-next=NULL;

head-data=1;

q=head;

for(int i=2;i=n;i++)

{

p=(node *)malloc(sizeof(struct node));//让系统分配一块新的内存

p-data=i;

p-next=NULL;

q-next=p;

q=q-next;

}

q-next=head;//建立循环链表

pri=q;p=head;//从head开始循环

people=0;passord=1;//出去了几个人、记录的密码数

while(peoplen)

{

pri=pri-next;

p=p-next;

passord++;

if(passord==m)

{

printf("%-4d",p-data);

node *temp;

temp=p;

pri-next=p-next;

p=p-next;

free(temp);

people++;passord=1;

}

}

printf("\n");

return 0;

}

int main()

{

int n,m;

printf("请输入人数和密码");

while(scanf("%d%d",n,m)!=EOF)

{

if(m0||n0)

{

printf("输入错误,请重新输入\n");

continue;

}

linktype(n,m);

}

system("pause");

return 0;

}

约瑟夫环问题

简单的方法就是拿一个数组来代表一个环,然后模拟报号出圈的过程,直到所有人都出圈。

以下参考代码

#include iostream

using namespace std;

int main()

{

int n,m,i,j,k;

cinnm;

int *p=new int[n];

for(i=0; in; i++)*(p+i)=i+1;//编号

for(j=k=0,i=1; kn; j=++j%n)//从左至右,重复扫描数组,直到所有人都出圈。

{

if(*(p+j)!=0)//用零来表示已出圈,出圈了不报号

{

if(i==m)//报号数与密码相同,则出圈

{

coutj+1" ";//cout*(p+i-1)" ";//输出编号

*(p+j)=0;//标记已出圈

++k;//累记出圈人数

i=1;//报号重置

}

else ++i;//继续报号

}

}

return 0;

}

数据结构设计约瑟夫环问题

问题描述:joseph环问题的一种描述是:编号为1,2,3,···,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序求出出列顺序。

基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号

测试数据:m的初始值为20;n=7,7个人的密码依次为3,1,7,2,4,8,4,首先m值为6

# include stdio.h

# define SIZE 20

int joseph(int a[],int m,int n)

{

int b[SIZE];

int i;

int flag=0;

int code;

int sum=n;

int point=0;

int num=m;

for(i=0;in;i++)

{ b[i]=i+1; }

while(sum!=0)

{

for(i=1;i=num;i++)

{ if(point=sum) point=1;

else point++;

}

num=a[point-1];

code=b[point-1];

for(i=point;i=sum;i++)

{ a[i-1]=a[i];

b[i-1]=b[i];

}

sum--;

flag++;

point--;

printf("已退出%d人,退出的人的编号为%d.\n",flag,code);

}

return 0;

}

main()

{

int m,n,i;

int array[SIZE];

printf("约瑟夫环求解,当前设置最大人数为%d.\n",SIZE);

printf("报数上限:\n");

scanf("%d",m);

printf("总人数为:\n");

scanf("%d",n);

for(i=0;in;i++)

{

printf("第%d人的密码为:",i+1);

scanf("%d",array[i]);

}

joseph(array, m, n) ;

return 0;

}

这是我之前做的大作业,望采纳。

约瑟夫环的问题,有n个人围坐一圈,依次报数123123…凡数到3的退出此圈,循环下去,问最后留下的是哪一号

#include stdio.h

int fun(int N)

{

int i,j,k,m;

int a[256];

m=0;

k=0;

for(i=0;iN;i++)

{

a[i]=i+1;

for(j=0;jN;)

{

if(a[j]!=0)

{

k++;

}

if(k==3)

{

m++;

if (m == N)

{

printf("The last number is : %d\n", a[j]);

return a[j];

}

a[j] = 0;

k=0;

}

if(j==N-1)

{

j=0;

}

else

{

j++;

}

}

}

int main()

{

int M;

scanf("%d",M);

printf("%d",fun(M));

return 0;

}

你的逻辑有点乱,写代码先将程序的逻辑理顺了, 否则就算程序恰巧能运行并得到你的结果, 你也不能确定它就是对的。

程序测试OK, 你可对比一下。

约瑟夫环问题:设编号为1,2,3,……,

#includeiostream

using namespace std;

#define TRUE 1

#define FALSE 0

#define OK 1

typedef 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);//约瑟夫环的实现

//-------------------------------------------------

void main()

{

int m,n;

cout"请输入初始密码(正整数)和人数"endl;

cinmn;

coutendl"请输入"n"个人的密码"endlendl;

LinkList L=EvaluList(n);

coutn"个人的密码为"endl;

ScanList(L);

coutn"个人的出列顺序为"endl;

Joseph(L,m);

}

//---------对单向循环链表进行尾插入赋值----------------

LinkList EvaluList(int n)

{

if(n==0)

return NULL;

int key;

cout"输入第1个人的密码 ";

cinkey;

LinkList L=new LNode;

L-data=key;

L-number=1;

L-next=L;

for(int i=2;i=n;i++)

{

LinkList p=new LNode;

int key;

cout"输入第"i"个人的密码 ";

cinkey;

p-data=key;

p-number=i;

p-next=L-next;

L-next=p;

L=L-next;

}

coutendl;

L=L-next;

return L;

}

//---------------求链表的节点个数-------------------

int size(LinkList L)

{

if(L==NULL)

return 0;

int i=1;

LinkList p=L-next;

while(p!=L)

{

i++;

p=p-next;

}

return i;

}

//---------------遍历单向循环链表--------------------

Status ScanList(LinkList L)

{

LinkList p=L;

if(p==NULL)

{

cout"人数为空"endl;

return FALSE;

}

cout"第1个人的密码 ";

coutp-dataendl;

p=p-next;

while(p!=L)

{

cout"第"p-number"个人的密码 ";

coutp-dataendl;

p=p-next;

}

coutendl;

return TRUE;

}

//----------------约瑟夫环的实现-----------------------

Status Joseph(LinkList L,int m)

{

if(L==NULL)

{

cout"人数为空,出列结束"endl;

return FALSE;

}

LinkList p=L;

while(p-next!=L)

p=p-next;

for(int n=size(L); n0 ; n--)

{

cout"密码为"m",出列编号为";

for(int i=1; i=m%n-1; i++)

p=p-next;

coutp-next-numberendl;

m=p-next-data;

LinkList q=p-next;

p-next=q-next;

free(q);

}

return OK;

}


文章题目:go语言约瑟夫环问题 链表实现约瑟夫环C语言
文章起源:http://pwwzsj.com/article/hpdihi.html