零K沁雪


私信TA

用户名:qczl

访问量:78103

签 名:

零K沁雪

等  级
排  名 44
经  验 12408
参赛次数 3
文章发表 35
年  龄 0
在职情况 在职
学  校
专  业

  自我简介:

解题思路:

1、使用数组模拟

2、默认数组值全为1,代表没有被点到。当被点到时,将其值设为0 。

3、使用一个for循环来完成上述逻辑。在此过程中记录被点到的人数,当只剩一个人没有被点到的时候结束。


注意事项:

参考代码:

#include<stdio.h>
#include<malloc.h>

int main()
{
	int i, *a; //*a 模拟人
	int n = 0; //人数
	int m = 0; //记录当前报数
	int k = 0; //被点到的人数
	scanf("%d", &n);
	a = (int *)malloc(sizeof(int)*n);
	for(i = 0; i < n; i++)
	{
		a[i] = 1;	//默认没被点到的为 1
	}
	for(i=0; i<n; i++)
	{
		if(a[i] != 0) //点到的为 0, 不为 0, 说明还没有被点到
			m++;
		if(m == 3)
		{
			m = 0;	  //重新从 0 开始报数
			k++;	  //退出的人数 +1
			a[i] = 0; //点到后记录为 0
		}
		if(i == n-1)  //报数到最后一个人,从头再开始
			i = -1;   //此处 i = -1 后,在 for 里面 +1 后为 0 
		if(k == n-1)  //如果退出的人比总人数少一个, 那么说明结束了
			break;
	}

	//没有被置为 0 就是最终胜利的人
	for(i=0; i<n; i++)
	{
		if(a[i] == 1)
		{
			printf("%d\n", i+1);
			break;
		}
	}
	free(a);
	return 0;

}


 

0.0分

30 人评分

  评论区

太帅了
2018-12-25 00:04:23
好厉害
2018-12-18 16:30:52
很好的思路,让我这种小白也可以看懂实现。
2018-12-03 15:21:45
点个赞
2018-10-07 20:10:08
这么漂亮的代码没人评论吗? 点个赞
2018-07-24 20:53:02