解题思路:设立一个数组当作人数,将他们初始化为0当作特征值,然后利用for循环和一个小技巧(i=(++i)%n)不断遍历数组,

for (i=0; i<n; i=(++i)%n)

再利用count计数,每当计数到3时改变特征值,并同时让计数归零重新计数,还有count2来计数总选出人数,

int count = 0;
int count2 = 0;

if (s[i] == 0){
    if (count2 == n-1){
	printf("%d", i+1);
	break;
    }
    count++;
    if (count == 3){
	s[i] = 1;
	count = 0;
	count2++;
    }
}

这样不断的循环下去之后能一直排除出每计数为3时的人,相对应count2也会增加计数,

直到count2等于总人数-1时我们就知道最后的那个人就是我们所需要的那个人,而由于是用数组下标来做的顺序编号,所以最后输出时要用i+1.

if (count2 == n-1){
    printf("%d", i+1);
    break;
}

注意事项:

    (1)小技巧:i=(++i)%n;    //这样子可以让i不断地从0到n-1,当++i=n时i会回退至0.

for (i=0; i<n; i=(++i)%n)

    (2)数组地初始化:之前我一直把1作为数组地初始值,即会写出s[100] = {1};这样地句子,很明显这是想当然了,后来就直接用了0当作初始值,因为若用1,要遍历赋值初始化,而0就只是s[100] = {0};就搞定。

int s[100] = {0};

    (3)最后面的输出,因为i时数组下标,所以最后输出时要加1.

printf("%d", i+1);

参考代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
	int n;
	scanf("%d" ,&n);
	int s[100] = {0};
	int count = 0;
	int count2 = 0;
	int i; 
	for (i=0; i<n; i=(++i)%n){
		if (s[i] == 0){
			if (count2 == n-1){
				printf("%d", i+1);
				break;
			}
			count++;
			if (count == 3){
				s[i] = 1;
				count = 0;
				count2++;
			}
		}
	}	
	return 0;
}

补充:数组的大小可以用malloc函数来帮助实现建立s[n]这种骚操作,本人因为还不熟悉malloc,所以没有用上,欢迎会的大神们指点一下。

(本文可能还有很多的下瑕疵,欢迎大家评论,指出和纠正,谢谢)

(喜欢的同学不妨评论一下或者点个赞噢~)

点赞(1)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

JakeLin 5年前 回复TA
华农兄弟666~