C语言之出圈游戏(详解)

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;
}

那啥,不懂得,欢迎在评论区留言小白,我一定会回复你的,别忘了点个赞哈。

  • 43
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值