一道C语言,有几点不太明白,希望赐教,希望大家不要见笑……

来源:百度知道 编辑:UC知道 时间:2024/09/24 13:34:42
有n个人围成一圈,按顺序从1到n编号好,从第一个人开始报数,报到3的人退出圈子,下一个人从1开始报数,报到3的人就退出圈子。如此下去,直到留下最后一个人。请按退出顺去输出圈子的顺序的人的编号……

#include<stdio.h>
void main()
{
int i,j,k,m,n,num[100],*p;

printf("enter number of people: n=\n");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=k=m=0;
while(m<n-1) {
if(*(p+i)!=0)
k++;
if(k==3) {
*(p+i)=0;
k=0;
m++;
printf("NO.%d\n",i+1);
}
i++;
if(i==n) / 这是什么意思啊/
i=0;
}

while(*p==0) /这是又什么意思啊 /
p++;
printf("NO.%d",*p);

if(i==n) /本轮循环结束,开始新的一轮循环/
i=0;
}

while(*p==0) /跳过值为0的元素(元素被淘汰后置0)/
p++;
printf("NO.%d",*p);

上一句:“如果if等于n,则使i等于0”

下一句:“当P的地址映射为0时”

if(i == n)
i = 0;
加入i和n相等就把i变成0.

while(*p==0)
p++;

加入p指针指向的值是0就让p指针一直后移,直到不是0为止。

if(i==n) i=0;是将3位置上的数置0;
while(*p==0)
p++; 当p指向的元素为0时,跳过。当*p不为0时跳出循环,不为0的那个元素就是最后剩下的人。
输出printf("NO.%d",*p);