一道c的题目,有代码可看不懂,数数问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 02:16:55
//哪位大侠帮忙解读一下
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#define nmax 50
main()
{
int i,k,m,n,num[nmax],*p;
printf("please 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+i)!=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);
}

#define nmax 50 //表示最多允许有50个人。
main()
{
int i,k,m,n,num[nmax],*p; //num这个数组存储的
printf("please input the total of numbers:");
scanf("%d",&n); //输入有多少个人n
p=num; //把p这个指针指向数组num。开始时p指向num[0]这个元素。
for(i=0;i<n;i++)
*(p+i)=i+1; //这个循环相当于是在给数组num赋初值,*(p+i)是第i行第0列元素的地址,其实可以换成num[i]=i+1。
i=0; //i这个变量用来控制报到那个学生了。
k=0; //k表示报的数是123的哪个。
m=0; //m是已经报过3的学生的人数
while(m<n-1) //执行循环的条件就是已经报过3的学生的人数m小于(总人数n-1)
{
if(*(p+i)!=0) k++; //if语句中的条件是当前报数的学生是否已经报过3了(下文中对已经报过3的会被赋值为0),没有的话就报一个数即k++,其中k是上一个人报的。
if(k==3) //判断十分已经报到3了。
{ *(p+i)=0; //如果报到3了,那么就把这个学生对应的数组值赋0以作为标记。
k=0; //报完3又回到0,这样下一个人就会报k++,即1了。
m++; //有人报了3当然m要加1了。
}
i++; //i控制哪个学生要报了
if(i==n) i=0; //如果当前报数的学生是圈中最后一个人,那么下一个人又回到开始了。归零。
}
while(*p==0) p++; //这个循环就找最后剩下的那个人了,因为报过3的人都被赋值为0了,剩下那个不为零的就是答案了。
printf("%d is left\n",*p);
}

#define nmax 50