题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下

#include<stdio.h>
int main()
{
int i,k,m,n,num[50],*p;
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1; //给每个人编号
i=0; //i为每次循环时的计数变量
k=0; //k为1 2 3 数的报数 变量
m=0; //m为退出的人数
while(m<n-1)
{
if(*(p+i)!=0) k++;
if(k==3)
{ *(p+i)=0; //对退出的人编号为0
k=0;
m++;
}
i++;
if(i==n)i=0; //报数到尾后i恢复为0
}
while(*p==0) p++;
printf("%d is left\n",*p);
}
请问 if(i==n) i=0```报数到尾后,恢复为0``可我想问的是,这句话都好像没有机会执行到啊,因为一到while(n<m-1)也就是比如n=5,那么到n=4的时候,m也等于4了,while循环就不执行了,那这句话就没用了``可是没了它``答案又是错的``求高手指教!!谢谢!!

就像题目中描述的那样,每次循环之后,数到3的人都被淘汰,其他的人构成一个新的圈。

该题目中:

if(*(p+i)!=0)
     k++;

就是实现了,那些没有被淘汰的人(数组的对应元素值不为0)围成一个圈。

但是,虽然被淘汰的人不再参与围成一个圈,但是,每次都要逐一判断这n人是否被淘汰,i就是用来记这个数的。

所以,每次的圈子,表面上是由没有被淘汰的人围起来的,但是逐一进行了判断。

希望对你有用。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-15
比如n=5,那么到n=4的时候,m也等于4了——n怎么会到等于4啊?

i 至少改变三次(每次+1) m 才会改变 1 次, if(i==n) i=0```怎么会执行不到呢?
第2个回答  2013-07-19
我有更好的

# include <stdio.h>
void nPeopleExit(int n,int m)
{
printf("退出顺序为:");
int p[100],count=0,flag=1,last;
for(int i=0;i<n;i++)
*(p+i)=1;
while(flag){
for(int i=0;i<n;i++)
if(*(p+i)){
count++;
if(count%m==0) {
count=count%m;
*(p+i)=0;
printf("%d ",i+1);
last=i+1;
}
}
flag=0;
for(int i=0;i<n;i++)
if(*(p+i)){
flag =1;
break;
}
}
printf("\n最后一个退出的为:%d\n",last);
}
void main()
{
int n,m;
printf("请输入有多少个人:");
scanf("%d",&n);
printf("请输入报到几的退出:");
scanf("%d",&m);
nPeopleExit(n,m);
}
第3个回答  2013-05-28
//程序在XP的VC6.0上调试成功,方法自己想的,如果你有更好的,更简介思路的程序,请回复在下方,求金币啊!!!!!!!!!!!!!!!!!!!!!!!!
//求赞!!!!!!!
#include<stdio.h>

#define M 3
void main()
{

int n,a[1000],*p,*pp,i,tuichu=0,num=0;
p=a,pp=a;
printf("请输入人数<小于1000>:");
scanf("%d",&n);

for(i=0;i<n;i++,p++)
*p=1;
p=pp;
while(tuichu!=n-1)
{
if(*p==1)
num++;
if(num==M)
{
*p=0,num=0, tuichu++;
}
p++;
if(p==(pp+n)) p=pp;

}
p=pp;
for(i=0;i<n;i++,p++)
{
if(*p==1)
{ printf("留下的最后一个人是第%d个\n",p-pp+1);break;}

}

}
第4个回答  2012-12-15
因为m++是有条件的,i++是无条件的。while(m<n-1),如n=5,那么到n=4的时候,m并没有增加到4

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

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

c语言题目;有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3...
n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3(退出)2:1 4:2 5:3...

C语言:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报...
int n = 0;int out = 0; \/\/退出的人数 int num = 0; \/\/报数 int a[1024] = {0}; \/\/0表示退出圈子 printf("Input n:");scanf("%d", &n);for (i = 0; i < n; i++){ a[i] = 1;} i = 0;while (out != n-1){ if (a[i] == 1){ num++;} if (num ==...

有n个人围城一圈,顺序排号。从第一个人开始报数(从1报到3),凡报到3...
i=0;k=0;m=0;while(m<n-1) \/\/此处的while循环是挑选报3的人退出圈子 { if(*(p+i)!=0) k++; \/\/初始从i=0开始不空则k加一 if(k==3) \/\/在k为3处,讲此处的值设为零---即推出圈子 { *(p+i)=0;k=0;m++;} i++;if(i==n) i=0; 当到达数组末尾时,置i...

C语言:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到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);} ...

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来...

...从第1个人开始报数(从1到3),凡报到3的人退出圈子,问最后留
num = 1;} else { if(num == 3){ ++count;} } a[i] = num;++num;} } } for(i = 0; i < N; ++i){ if(a[i] != 3)break;} printf("%d\\n", i);return 0;} \/\/妹子这很简单,就几步,用数组模拟学生数,给元素赋值,最后留一个不是3的就停止赋值循环,最后遍历一下...

...从第一个人开始报数(从1到3报数),凡报到3的人退出
public class Increase {public static void rep(boolean[] people) {int i = 0,j=0,n=people.length,m=n;while(n>2){i=++i%m;if (people[i] == true){j++;if (j==3){people[i] = false;System.out.println(i);n--;\/\/总人数减1j = 0;\/\/到3从头数}}}public static void...

检查顺序排号
有n个人围成一圈,顺序排号。从第1个学生开始报数(从1到3报数),凡报到3的学生退出圈子,到最后留下一名学生,问最后留下的是原来第几号的学生。

相似回答