读书人

”n个人围城一圈依次报1,2,3,然后报

发布时间: 2013-02-18 10:50:49 作者: rapoo

”n个人围城一圈,依次报1,2,3,然后报3的人推出,求最后留下来的是第几号“的问题
这个问题最后留下来的不是有两个吗?
编号从1 开始的话,1号肯定留下吧!那用下面这个程序 ,每次都是 结果都是1 !
----------

# include <stdio.h>

int main ()
{
int num[100],*p,n,m/*退出的人数*/,i/*每次循环的计数器*/,k/*按1,2,3时的计数器*/;
//确定人数;
printf ("input the number of person,n=");
scanf ("%d",&n);
i=0; //初始化;
k=0;
m=0;
//对每个人进行编号;
p=num;

for (i=0;i<n;i++)
{
*(p+i)=i+1;
}
while (m<n-1)
{
if (*(p+i)!=0)
{
k++;
}
if (3==k)
{
*(p+i)=0; //将退出的人的编号置为0;
k=0;
m++;
}
i++;
if (n==i)
{
i=0;
}

}

while (*p==0)
{
p++;
}
printf ("The last one is no.%d\n",*p);
return 0;
}

[解决办法]
哦你下标是0开始。那就是i没有初始化为0。进入while的时候i一开始就是n,后面就全乱了。
[解决办法]
仅供参考
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈总人数
i=1;//座位编号
k=1;//当前要数的数
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}

读书人网 >C语言

热点推荐