PTA7-5 出圈游戏
用指针实现以下功能:有n个人围成一个圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。
(1)编程提示
每三个人离开,置为0;当数到最后一个人时,将指针重新指向第一个人;m表示离开的人数,当m=n-1时,说明只剩下一个人,循环结束。
输入样例:
10
输出样例:
4
上面是题目的要求。
本小白的思路是让n个人形成一个一维数组,每次判断该人是不是要离开,
如果离开,这就不添加到这个一维数组里,并记录下来离开的人数,否则,就在数组里加上这个人,最后判断离开的人数是不是等于n-1(n-1,这点应该很好懂吧),并输出最后一个数。
代码如下:
首先,输入数组a[100],将n个人的编号(编号:他是第几个人的编号就是几)依次输入到这个数组里;
int i,a[100],n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a[i]=i; /i就是每个人的编号/
}
i=1; //小白觉得把那啥这个人的编号从1开始比较好算、好理解//
int t=0,m=0; //这个t是判断的人数变量,m是记录人离开的数量//
while(m!=n-1)//括号里的是判断条件,因为最后只剩一个人//
{
t++;
if(t!=3)
{
a[i+n-m]=a[i];//这一步很关键,i+n-m=i是数组后面按顺序将判断时没淘汰的人排在了后面//
// printf("%d-%d-%d\n",a[i],a[i+n-m],i+n-m);
//这是检验每一步的数组元素是否为在草稿上演算的一样//
}
else
{
m++;
t=0;
}
i++;
}
最后输出结果
printf("%d\n",a[i+n-m-1]);//因为最后i的值增加了1(就是i++啦),所以最后输出时要减去1//
完整代码如下:
#include<stdio.h>
int main()
{
int i,a[100],n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a[i]=i;
}
i=1;
int t=0,m=0;
while(m!=n-1)
{
t++;
if(t!=3)
{
a[i+n-m]=a[i];
// printf("%d-%d-%d\n",a[i],a[i+n-m],i+n-m);
}
else
{
m++;
t=0;
}
i++;
}
printf("%d\n",a[i+n-m-1]);
return 0;
}
指针方法主要代码如下:
#include<stdio.h>
int main()
{
int i,n,a[100],*p=a,*q;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
*(p+i)=i;
}
int t=0,m=0;
i=1;
while(m!=n-1)
{
t++;
if(t!=3)
{
*(p+i+n-m)=*(p+i);
}
else
{
m++,t=0;
}
i++;
}
printf("%d\n",*(p+i+n-m-1));
return 0;
}
那啥,不懂得,欢迎在评论区留言小白,我一定会回复你的,别忘了点个赞哈。