N个人围成一个圈顺序编号,从第一个人开始报数(从1到M),凡报到M的人退出圈子,问最后一个圈中的人的编

如题所述

void Josegh(n)
{
int i,j,k,s1,w;
s1=s;
for(i=1;i<=n;i++) /*给n个人从1到n编号*/
p[i-1]=i;
for(i=n;i>=2;i--)
{
s1=(s1+m-1)%i; /*下一个开始报数的人的编号是(s1+m-1)%i*/
if(s1==0) /*若s1为0,则说明要开始报数的是最后一个人*/
s1=i;
w=p[s1-1]; /*将要出圈的人移至数组的最后*/
for(j=s1;j<=i-1;j++)
p[j-1]=p[j];
p[i-1]=w;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-17
M-1
第2个回答  2009-12-17
呵呵。当年还没学到数组的时候就被老师留了这道题。想了一晚上。才做出来~看着好亲切诶~
第3个回答  2009-12-17
貌似面试的时候我也遇到过这样的问题。。。
时间太紧,程序没写出来,改天有空写出来了,再给你。

N个人围成一个圈顺序编号,从第一个人开始报数(从1到M),凡报到M的人退 ...
s1=(s1+m-1)%i; \/*下一个开始报数的人的编号是(s1+m-1)%i*\/ if(s1==0) \/*若s1为0,则说明要开始报数的是最后一个人*\/ s1=i;w=p[s1-1]; \/*将要出圈的人移至数组的最后*\/ for(j=s1;j<=i-1;j++)p[j-1]=p[j];p[i-1]=w;} } ...

有N个人围成一个圈顺序编号,从第一个人开始报数(从1到M),凡报到M的...
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3...

N个人围成一圈报数
N个人围成一圈,从第1个人开始顺时针1,2,3,4,...M的顺序报数,数到M的人出圈,然后从出圈的下一个人开始重复此过程,直到圈中所剩的人数为M-1个人。输出所有出圈的人的顺序,并输出剩余的人的编号

...围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的...
就像题目中描述的那样,每次循环之后,数到3的人都被淘汰,其他的人构成一个新的圈。该题目中:if(*(p+i)!=0) k++;就是实现了,那些没有被淘汰的人(数组的对应元素值不为0)围成一个圈。但是,虽然被淘汰的人不再参与围成一个圈,但是,每次都要逐一判断这n人是否被淘汰,i就是用来记...

有n个人围城一圈,顺序排号。从第一个人开始报数(从1报到3),凡报到3...
for(i=0;i<n;i++) \/\/此处的for循环是给这n个人编号:第一个是1,第二个是2,……而且,仍然保持p指向数组num的起始处 (p+i)=i+1;i=0;k=0;m=0;while(m<n-1) \/\/此处的while循环是挑选报3的人退出圈子 { if(*(p+i)!=0) k++; \/\/初始从i=0开始不空则k加一 if(k...

有n个人围成一圈,顺序排号,从第一个人开始报数,凡报到3的人退出圈子...
当num=0时表示数组对应下标的人退出圈子,循环,最后留下来的人的号数就是数组中不为零的下标。\\x0d\\x0a\/*用数组模拟这n个人,用num来记他们的报数*\/\\x0d\\x0a#include \\x0d\\x0ausing namespace std;\\x0d\\x0aint func(int n)\\x0d\\x0a{\\x0d\\x0aint residue = n;\/\/表示剩余...

有n个人围成一圈,顺序排号。从第一个人开始报数 凡报到3的人退出圈子...
参考:http:\/\/hi.baidu.com\/do_sermon\/item\/e325a8d627fa39bd33db909b

有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3),凡报到3的人...
define N 4 int main(void){ int a[N];int num = 1;int count = 0;for(int i = 0; i < N; ++i, ++num){ if(num == 4){ num = 1;} if(num == 3){ ++count;} a[i] = num;} while(count != N-1){ count = 0;for(i = 0; i < N; ++i){ if(a[i] =...

...围成一圈,顺序排号。从第一个人开始报数(从1到3报 数),凡报到3的...
if(*p==0){\/\/如果健在 if(out_n==(N-1))break;\/\/如果仅剩一人 call_n++;\/\/报数 call_n%=3;\/\/最大为3,到了3就从0开始 if(call_n==0){*p=1;out_n++;}\/\/为0(即3)出局 } p++;if(p==a+N)p=a;\/\/循环转向下一人 } printf("最后剩余者的编号是:%d\\n",p+1-a);} ...

...有n个人围成一圈,顺序排号,从第一个人开始(从1-
{ char student[N];\/\/N个人,1表示未退出,0表示已经退出 int out[N];\/\/退出的人的号码记录 int count = -1;\/\/循环计数 0,1,2 <=> 1-3 int num_out = -1;\/\/退出号码记录的数组的下标 memset(student, 1, sizeof(student));\/\/将所有人状态置为1(未退出)for (int i = 0;...

相似回答