魯智深喫不到饅頭

魯智深喫不到饅頭

1 問題導向

最近遇到一個問題,大致是這樣:魯智深到一個寺廟,寺廟裏有連同住持、小和尚在內共99人,99個饅頭。
魯智深想喫饅頭,住持不想分饅頭給他,於是住持設計了一個遊戲:他們100個人圍成一圈坐着,從某個和尚開始數數:123451、2、3、4、5,數到數字 5{\color{Red}{5}} 的人可以喫到饅頭,並且出列。下一位繼續從 1 開始數數,數到數字 5{\color{Red}{5}} 的人可以喫到饅頭,並且出列,下一位繼續從 1 開始數數…以此類推。
請問住持改把魯智深安排在第幾號座位上,才能使他喫不到饅頭,不能出列?(假設座位號總數=人數)

2 思考

  • 如果思考素數篩選的方法,似乎可以把這個位置曬出來。
  • 當然,模數運算也有用。
    • 總共有100個人,座位號有1~100,初始值都可以設爲1;
    • 99個饅頭,假設喫到饅頭的人,其值可以設爲0;
    • 必須要有計數5的一個計數器,並且要會循環。

3 代碼

#include<iostream>
using namespace std;
int main(){
    
    int index[100]; // 100個位置,100個索引
    for(int i = 0; i < 100; i++){
        index[i] = 1; // 假設值都爲 1
    }

    int num = 1; // 喫到饅頭的人,應該爲 99,起始爲 1
    int count = 0; // 記錄數的數字 1~5
    for(int i = 0; num < 100; ++i){
        count += index[i%100]; //利用模數運算,爲了保證轉一圈後索引不變
        if(count == 5){ // 數到 5 停一下
            index[i%100] = 0; // 這個位置上的人出列了
            num++; // 喫到饅頭了
            count = 0; // 出列一個人後,重新數數
        }
    }
    for(int i = 0; i < 100; i++){
        if(index[i])cout << i+1 << endl; // 輸出位置
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章