C语言经典例69-有n个人围成一圈报数问题
1 题目
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
2 分析
假设全部人都退圈,则最后一个退圈的人就是题目中留下的那一位,详细思路请见实现中的注释。
3 实现
#include <stdio.h> int main() { int a[100]; // 保存人数的数组 int n; // 用户输入初始有多少人 int i; // 循环控制变量 int k = 0; // 统计一共有多少人退圈,初始为0 int count = 0; // 每轮报号累加数 int lastone; // 记录每轮退圈的人的号码 printf("请输入人数:"); scanf("%d", &n); //n为人数 //对于每个人a[i], 他的编号实际上是i+1 for (i = 0; i < n; i++) { // i表示人的状态,若a[i]=1,则表示i+1号在圈内 // 若a[i]=0,则表示i+1号在圈外,初始所有人都在圈内 a[i] = 1; } // 当所有人都退出圈子时停止循环 // 最后退圈的人就是题中有一个留在圈内的那个人 while (k < n) { //对所有编号开始循环 for (i = 0; i < n; i++) { //判断i+1号是否在圈内 if (a[i] == 1) { //若在圈内,则报号 count++; //判断号码是否为3的倍数 if (count % 3 == 0) { a[i] = 0; //若是3的倍数,则a[i]出圈 k++; //退圈人数+1 lastone = i + 1; //记录此时退圈人的号码 } } } } //将最后退圈的人的号码输出 printf("留下来的那个是%d号 ", lastone); }
4 运行结果
PS E:C++WorkSpace> cd "e:C++WorkSpace" ; if ($?) { g++ FFF.cpp -o FFF } ; if ($?) { .FFF } 请输入人数:8 留下来的那个是7号 PS E:C++WorkSpace> cd "e:C++WorkSpace" ; if ($?) { g++ FFF.cpp -o FFF } ; if ($?) { .FFF } 请输入人数:20 留下来的那个是20号 PS E:C++WorkSpace> cd "e:C++WorkSpace" ; if ($?) { g++ FFF.cpp -o FFF } ; if ($?) { .FFF } 请输入人数:17 留下来的那个是11号