目錄
- 1 題目
- 2 分析
- 3 實作
- 4 運作結果
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号\n", 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号