早教吧作业答案频道 -->其他-->
一个C++约瑟夫环的问题一群人围坐一圈,每人一个密码,一开始人选一个正整数作为报数上线M,丛第一个人开始顺时针方向自1开始报数,报道M停止,报出M的人出列,将他的密码作为新的M,丛他在顺
题目详情
一个C++约瑟夫环的问题
一群人围坐一圈,每人一个密码,一开始人选一个正整数作为报数上线M,丛第一个人开始顺时针方向自1开始报数,报道M停止,报出M的人出列,将他的密码作为新的M,丛他在顺时针方向的下一个人开始重新从1开始报数,如此下去直到所有人全部出列为止.
初值M=20;人数N=7;密码依次为3 1 7 2 4 8 4;
出列顺序为6 1 4 7 2 3 5
一群人围坐一圈,每人一个密码,一开始人选一个正整数作为报数上线M,丛第一个人开始顺时针方向自1开始报数,报道M停止,报出M的人出列,将他的密码作为新的M,丛他在顺时针方向的下一个人开始重新从1开始报数,如此下去直到所有人全部出列为止.
初值M=20;人数N=7;密码依次为3 1 7 2 4 8 4;
出列顺序为6 1 4 7 2 3 5
▼优质解答
答案和解析
#include
#include
/*结构体*/
struct node
{
int num,secret;
struct node *next;
};
/*建造循环链表,并返回头指针*/
node *creatlinklist(int m)
{
node *head,*p,*q;
head=p=(node *)malloc(sizeof(node));
int j;
printf("输入第1个密码:");
scanf("%d",&j);
p->secret=j;
p->num=1;
for(int i=2;isecret=j;
q->num=i;
p->next=q;
p=q;
};
p->next=head;
return(head);
};
/*按规则实现排列*/
/*第一种方法 找到一个打印一个*/
/*void fun(node *H,int K,int M)
{
int i,j;
node *p;
for(j=1;jnext->secret;
printf("%d\t",p->next->num);
p->next=p->next->next;
H=p->next;
};
for(i=1,p=H;inext);
printf("%d\t",p->num);
printf("%d\t",p->next->num);
printf("\n");
};*/
/*第二种方法 把循环链表按规则变成单链表*/
void fun(node *H,int K,int M)
{
node *p,*q,*nhead;
int i,e;
/*按规则找到第一个节点,并将其作为新链表头结点nhead ,尾节点q*/
for(i=1,p=H;inext);
nhead=q=p->next;
K=q->secret;
p->next=p->next->next;
/*按规则找到剩下的节点并用尾插法连到新链表尾节点后*/
for(e=1;enext;inext);
K=p->next->secret;
q->next=p->next;
q=p->next;
p->next=p->next->next;
};
for(i=1,p=p->next;inext);
q->next=p;
/*输出序列*/
printf("输出密码序列:\n");
for(p=nhead,i=1;inext)
{
int j=p->secret;
printf("%d\t",j);
};
printf("\n输出顺序序列:\n");
for(p=nhead,i=1;inext)
{
int j=p->num;
printf("%d\t",j);
};
printf("\n");
};
/*主程序*/
void main()
{
int n,k;
node *h;
printf("输入节点数n:");
scanf("%d",&n);
printf("输入k值:");
scanf("%d",&k);
h=creatlinklist(n);
fun(h,k,n);
}
#include
/*结构体*/
struct node
{
int num,secret;
struct node *next;
};
/*建造循环链表,并返回头指针*/
node *creatlinklist(int m)
{
node *head,*p,*q;
head=p=(node *)malloc(sizeof(node));
int j;
printf("输入第1个密码:");
scanf("%d",&j);
p->secret=j;
p->num=1;
for(int i=2;isecret=j;
q->num=i;
p->next=q;
p=q;
};
p->next=head;
return(head);
};
/*按规则实现排列*/
/*第一种方法 找到一个打印一个*/
/*void fun(node *H,int K,int M)
{
int i,j;
node *p;
for(j=1;jnext->secret;
printf("%d\t",p->next->num);
p->next=p->next->next;
H=p->next;
};
for(i=1,p=H;inext);
printf("%d\t",p->num);
printf("%d\t",p->next->num);
printf("\n");
};*/
/*第二种方法 把循环链表按规则变成单链表*/
void fun(node *H,int K,int M)
{
node *p,*q,*nhead;
int i,e;
/*按规则找到第一个节点,并将其作为新链表头结点nhead ,尾节点q*/
for(i=1,p=H;inext);
nhead=q=p->next;
K=q->secret;
p->next=p->next->next;
/*按规则找到剩下的节点并用尾插法连到新链表尾节点后*/
for(e=1;enext;inext);
K=p->next->secret;
q->next=p->next;
q=p->next;
p->next=p->next->next;
};
for(i=1,p=p->next;inext);
q->next=p;
/*输出序列*/
printf("输出密码序列:\n");
for(p=nhead,i=1;inext)
{
int j=p->secret;
printf("%d\t",j);
};
printf("\n输出顺序序列:\n");
for(p=nhead,i=1;inext)
{
int j=p->num;
printf("%d\t",j);
};
printf("\n");
};
/*主程序*/
void main()
{
int n,k;
node *h;
printf("输入节点数n:");
scanf("%d",&n);
printf("输入k值:");
scanf("%d",&k);
h=creatlinklist(n);
fun(h,k,n);
}
看了 一个C++约瑟夫环的问题一群...的网友还看了以下:
在维新派创办的报刊中,居南北舆论界领导地位的是A.《万国公报》和《时务报》B.《中外纪闻》和《国闻 2020-05-13 …
猴子选大王n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报 2020-05-16 …
约瑟夫环问题解答。需要算法和数据结构1.约瑟夫环问题[问题描述]设有n个人围坐一圈,现从第s个人开始 2020-11-06 …
李克强总理在政府工作报告中指出:新的一年,要紧紧围绕党在新形势下的强军目标,全面加强军队革命化现代化 2020-11-21 …
围绕“实现富强、民主、文明、和谐的社会主义现代化国家的共同理想”这一主题,九年级某班同学收集并播报了 2020-11-28 …
1866年7月22日的《上海新报》,刊登了一则介绍英国机器图画的广告,内云:“本馆新到英国寄来画图一 2020-12-10 …
大众传播媒体促进了中国近代文化教育的发展和社会习俗的变化。请问:中国人自办的第一份近代报纸是()A. 2020-12-16 …
据新华网报道,智利当地时间27日凌晨发生里氏8.8级地震,现已造成800多人死亡,损失惨重。读图完成 2020-12-17 …
同学们做游戏,50人围成一圈,老师给每个人都编成了一个号码,从1-50号.老师让大家从1号开始“一、 2020-12-31 …
同学们做游戏,50人围成一圈,老师给每个人都编成了一个号码,从1-50号.老师让大家从1号开始“一、 2020-12-31 …