问题描述
耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒请使用双向链表实现编写该程序,依次输出出局人的编号。
输入格式
无
输出格式
输出13行,前12行分别是按顺序出局的人的编号。第13行输出叛徒的编号。
竞赛试题都是只看结果不看实现过程的,结果对了就得分。
所以选择用最简单的数组来实现。
虽然类似的题目做了很多了,不过做了一下发现还是挺难的。
参考自https://blog.csdn.net/Aurora____/article/details/105324409
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool vis[14]; //若为true则表示被标记 4 int a[14]; 5 int main() { 6 int t = 1; //t表示从1到3数数 7 int count = 0; //用来统计被标记的个数 8 for (int i = 1; count != 12; i++) { //当个数等于12后,说明全被找到了,就可以退出了 9 if (vis[i] == false) { //如果没被标记,就从1 - 2赋值 10 a[i] = t; 11 } else { //否则就执行下一次循环 12 continue; 13 } 14 if (a[i] == 3) { 15 vis[i] = true; //执行标记操作; 16 cout << i << endl; 17 t = 1; //和下面的配合,从1-3反复赋值 18 count++; //找到一个 19 } else { 20 t++; 21 } 22 if (i == 13) { //循环到最末,就又从编号为1的开始。 23 i = 0; 24 } 25 } 26 for (int i = 1; i <= 13; i++) { //找出最后一个没有被标记的人,也就是出卖耶稣的人哈哈哈哈哈哈。 27 if (vis[i] == false) { 28 cout << i << endl; 29 } 30 } 31 return 0; 32 }