有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
解題思路: 從第一個人開始,逐個報數,誰報3就退出,並且重置報數,直到最后一個人后,又重新從第一個人繼續報數,直到最終只剩一個人的時候退出即可。
答案:
#include <stdio.h>
int main()
{
int people[128], n;
printf("Please input how many people: ");
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
people[i] = i + 1; //對每個人順序排號
}
int remain = n;
int num_off = 0;
int *p = NULL;
while (remain > 1) {
p = people;
while (p != people + n) { // 每次從第一個位置開始,直到最后一個位置,報數是一直遞增的
if ((*p) != 0) {//若這個位置人還在
num_off++; //則報數
if (num_off == 3) {//否則當前的人即將要報的數字是3
*p = 0; //則剔除這個人
num_off = 0; //並且重新開始計數,下邊會++,所以是從1開始報數
remain--;//剩余人數-1
}
}
p++;
}
}
for (int i = 0; i < n; i++) {
if (people[i] != 0) {
printf("Serial number of the remaining person:%d\n", people[i]);
}
}
printf("\n");
system("pause");
return 0;
}