共有三种解法:我先给你一个同密码,循环链表写的吧!
在炎陵等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都做网站 网站设计制作按需制作网站,公司网站建设,企业网站建设,品牌网站制作,成都营销网站建设,外贸营销网站建设,炎陵网站建设费用合理。
欢迎采纳并追问!
#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;
}
这是我之前做的大作业,望采纳。
#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, 你可对比一下。
#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;
}