天天看點

C語言經典例69-有n個人圍成一圈報數問題1 題目2 分析3 實作4 運作結果

目錄

  • 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号
           

繼續閱讀