初学者请教一个C语言问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 08:13:46
原题:有n个人围成一圈顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的那位是原来的第几号?
书上的答案是:
#include "stdio.h"
#define nmax 50
void main()
{
int i,k,m,n,num[nmax],*p;
printf("input the total of numbers:");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0; k=0; m=0;
while(m<n-1)
{ if(*(p+1)!=0) k++;
if(k==3)
{ *(p+i)=0;
k=0;
m++;
}
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf("%d is left\n",*p);
}

哪位高手能帮我把具体的思路分析给我吗?
这个程序我运行时,好像也有问题。

#include "stdio.h"
#define nmax 50
void main()
{
int i,k,m,n,num[nmax],*p;
printf("input the total of numbers:");
scanf("%d",&n);
p=num;

for(i=0;i<n;i++) //num[]={1,2,3,4,...,i+1}
*(p+i)=i+1;

i=0; k=0; m=0;
while(m<n-1) //当只留下一个人的时候,退出
{
//发现书上有个错误:if(*(p+1) != 0)应改为if(*(p+i) != 0)
//*(P+1)每次访问的是第2个数
if(*(p+i) != 0)//被标记为0的人(即被淘汰的人)不加入记数
k++;

if(k==3)
{
*(p+i)=0; //把报数为3的那个人标记为0
k=0; //重新开始报数
m++; //记数:有多少个人被淘汰了
}

i++; //主要用于*(p+i)指示当前访问的是哪个数
if(i==n)
i=0;
}

while(*p==0)
p++; //没有被标记为0的人就是留下的那个

printf("%d is left\n",*p);
}

不懂

这个网上好多好多呢