C语言杀人小游戏 n个人围成一圈,依次报数(1到3),报到3的人淘汰,问最后剩下的那个人的位置?

756 阅读2分钟

1.问题:n个人围成一圈,顺序排号,从第1个人开始报数(1到3报数),凡报到3的人退出圈子,问最后留下的是原来几号?

2.程序运行效果

数字游戏.gif

3.解题思路

先从键盘获取用户输入人数,用while循环来寻找报数号码为3号的人,在一开始时给每个人赋值为1(1为存活,0为死亡),每循环一次num值加1,直到num值为3时,说明此时这个人报的数为3,需要淘汰,则将原来的赋值变为0,此时再用sum记录淘汰的人数,最后跟总人数比较,直到剩下一个人为止。

4.代码实现

// 数字游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>

int main()
{
	int k, i;
	int num = 0;//用来记录循环次数,当num=3是说明报数报到3了
	int sum = 0;//用来记录一共淘汰了几个人
	int people[100];
	bool key = true;//用来确定循环是否执行
	printf("请输入参与游戏人数:");
	scanf("%d", &k);

	for (int i = 0; i < k;i++) {
		people[i] = 1;
		//printf("参与游戏人数:%d",people[i]);
	}
	while (key)
	{
		i = 0;//初次循环时数组的下标
		while (i<k)
		{
			if (people[i]==1)
			{
				num = num + 1;//每个人报数
			}
			if (num==3)
			{
				people[i] = 0;
				sum = sum + 1;//记录淘汰人数
				num = 0;
			}
			i++;//循环一次下标加1
		}
		if (sum==k-1)//用来确定是否只剩下一个人,如果是就不执行while循环
		{
			key = false;
		}
	}
	for (int i= 0;i < k; i++)
	{
		if (people[i]==1){
			printf("余下人的号码为:%d\n\n", i + 1);
			break;
		}
	}
	return 0;
}

5.感悟

今天学习了关于数组的一些知识点,数组这种东西看似简单,实则不然,要想灵活的运用就得对各个知识点融会贯通,今天这个题目起初一看我就一脸懵逼,除了定义几个变量以为我不知从何下手,只能找来本子跟个小学生一样一个一个掰指头来算,不过最后还是勉勉强强的写了出来,如果有什么不对的地方,请指正!