题题69-69-类约瑟夫环问题类约瑟夫环问题有有nn个人围成一圈,顺序排号。从第一个人围成一圈,顺序排号。从第一个人开始报数(从个人开始报数(从11到到33报数),凡报报数),凡报到到33的人退出圈子,问最后留下的是的人退出圈子,问最后留下的是原来第几号的那位。原来第几号的那位。1210548769n3如何来确定人出局的顺序如何实现最后一位数完又从第一位开始数的问题如何判断某人是否出局流程图代码•如何来确定人出局的顺序?如何来确定人出局的顺序?我们可以把点名看成是不重复的,比如,有我们可以把点名看成是不重复的,比如,有NN个人,个人,第一轮后剩第一轮后剩N1N1个人、第二轮剩个人、第二轮剩N2N2个人……以此类推;个人……以此类推;那么,第二轮的地那么,第二轮的地MM个人可以看做第个人可以看做第N+MN+M次被点名。次被点名。因此被淘汰的总是能被因此被淘汰的总是能被33整除的。整除的。如何实现最后一位数完又从第一位开始如何实现最后一位数完又从第一位开始数的问题?数的问题?很简单,我们可以用模运算(很简单,我们可以用模运算(%%)来完成。)来完成。比如:比如:1%3=11%3=1;;2%3=2;3%3=0;4%3=2%3=2;3%3=0;4%3=11。。因此我们可以用因此我们可以用j=i%n+1j=i%n+1((jj表示人的序号,表示人的序号,nn表示场上还剩的人数,表示场上还剩的人数,ii表示点名表示点名次数次数))来实现上述循环来实现上述循环如何判断某人是否出局如何判断某人是否出局我们可以用数组我们可以用数组a[j]a[j]来表示每个人,下标来表示每个人,下标jj表示他的序号,数组元素的值组表示表示他的序号,数组元素的值组表示他在场与否,比如:他在场与否,比如:a[j]=0a[j]=0表示他已出局表示他已出局;a[j]=1;a[j]=1表示他还在场。表示他还在场。流程图流程图源代码源代码#include#include#include#includeintmain()intmain(){{intn;intn;printf("pleaseinputthevualeofprintf("pleaseinputthevualeofn:\n");n:\n");scanf("%d",&n);scanf("%d",&n);boola[n+1];boola[n+1];inti,j;inti,j;for(i=1;i<=n;i++)for(i=1;i<=n;i++)a[i]=1;a[i]=1;intcount=n;intcount=n;i=0;i=0;intpasswd=0;intpasswd=0;while(count!=0){j=i%n+1;if(a[j]==1){passwd++;if(passwd%3==0){a[j]=0;count--;}}i++;}printf("thelastnemberis%d:\n",j);system("pause");return0;}用指针实现用指针实现•定义两个数列:一个表示队列定义两个数列:一个表示队列(person)(person),一个存放出列顺序,一个存放出列顺序(pout)(pout)•先把数组先把数组personperson赋值(赋值(00表示已出列)表示已出列)•找出出列顺序找出出列顺序•用用temptemp表示循环计数表示循环计数•用指针用指针pp的移动计算出列顺序的移动计算出列顺序•1.temp1.temp在在00到到mm间循环,间循环,•指针指针pp在数组上随着在数组上随着temptemp的增加而移动的增加而移动•当当temptemp等于等于mm时,标记指针所指向的值为时,标记指针所指向的值为00,表示该元素已出列,表示该元素已出列m--m--•把已出列的元素移动到数组把已出列的元素移动到数组popo数组数组•2.2.当指针移动到队尾的时候,指针重新指向开头当指针移动到队尾的时候,指针重新指向开头•当指针指向已出列的元素(值为当指针指向已出列的元素(值为00)时,指针向后移动)时,指针向后移动temptemp不增加不增加••打印打印popo得到出列顺序得到出列顺序代码代码•#include"stdio.h"#include"stdio.h"•#include"stdlib.h"#include"stdlib.h"•voidgoout(intp[],intpovoidgoout(intp[],intpo[],intn,intm);[],intn,intm);•main()main()•{{•int*preson=NULL,*int*preson=NULL,*pout=NULL;//pout=NULL;//出队顺序初值为出队顺序初值为-1;-1;•intn,i,m;intn,i,m;•printf("Pleaseinputprintf("Pleaseinputthevalueofn:\n");thevalueofn:\n");•scanf("%d",&n);scanf("%d",&n);•preson=(int*)malloc(n*sizeof(int));preson=(int*)malloc(n*sizeof(int));////申请动态数组申请动态数组pout=(int*)malloc(n*sizeof(int));po...