解题思路:设立一个数组当作人数,将他们初始化为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 人评分
C二级辅导-等差数列 (C++代码)浏览:2309 |
剔除相关数 (C语言代码)浏览:1924 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:1763 |
母牛的故事 (C语言代码)浏览:1748 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:556 |
C语言训练-大、小写问题 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:910 |
字符逆序 (C语言代码)浏览:706 |
IP判断 (C语言描述,蓝桥杯)浏览:1118 |