魯智深喫不到饅頭
1 問題導向
最近遇到一個問題,大致是這樣:魯智深到一個寺廟,寺廟裏有連同住持、小和尚在內共99人,99個饅頭。
魯智深想喫饅頭,住持不想分饅頭給他,於是住持設計了一個遊戲:他們100個人圍成一圈坐着,從某個和尚開始數數:,數到數字 的人可以喫到饅頭,並且出列。下一位繼續從 1 開始數數,數到數字 的人可以喫到饅頭,並且出列,下一位繼續從 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;
}