华农赵子龙


私信TA

用户名:201812100214

访问量:1478

签 名:

等  级
排  名 3094
经  验 2037
参赛次数 1
文章发表 3
年  龄 0
在职情况 学生
学  校 华南农业大学
专  业

  自我简介:

TA的其他文章

解题思路:设立一个数组当作人数,将他们初始化为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,所以没有用上,欢迎会的大神们指点一下。

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

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

 

0.0分

2 人评分

  评论区

华农兄弟666~
2019-12-15 13:23:52
  • «
  • 1
  • »