問題描述:
圍繞著山頂有10個洞,一隻狐狸和一隻兔子住在各自的洞裡。狐狸想吃掉兔子。一天,兔子對狐狸說:“你想吃我有一個條件,先把洞從1-10編上號,你從10號洞出發,先到1號洞找我;第二次隔1個洞找我,第三次隔2個洞找我,以後依次類推,次數不限,若能找到我,你就可以飽餐一頓。不過在沒有找到我以前不能停下來。”狐狸滿口答應,就開始找了。它從早到晚進了1000次洞,累得昏了過去,也沒找到兔子,請問,兔子躲在幾號洞裡?
分析:
我們設定一個數組a[11],用來表示這10個山洞(a[0]不使用),並且初始化為0(數組元素值為0表示該洞穴狐狸沒有進入過),然後用多次迴圈類比狐狸找兔子的過程,狐狸找兔子的迴圈肯定是有一個有限迴圈,我們不妨設定為1000,因為狐狸找了1000次還找不到兔子的話,早就累死了=.=
然後,這10個山洞是圍成了一個圈的,所以是在逐一查看數組中的內容,用除n取餘來限制。
程式碼:
#include<iostream>using namespace std;int main(){ int a[11]={0}; int i=0,k=0; int n=10; for(i=1;i<=1000;i++){//設定迴圈的次數,也就是狐狸找兔子的次數 k=(k+i)%n;//因為洞穴圍成了一個圈 if(k==0)k=n;//當k為0的時候,說明可以整除 a[k]=1;//將數組值設定為1,表示這個洞狐狸已經進入過了 } for(i=1;i<=n;i++){ if(a[i]!=1){ cout<<"\n洞穴"<<i<<"安全"<<endl; } }cout<<endl; return 0;}
運行介面:
延伸思考
題目中說的洞穴是10個洞穴,我們可以很容易的擴充成,讓使用者輸入任何一個可能的洞穴的個數n。
我們只需要讓數組大一點就可以了。
#include<iostream>using namespace std;int main(){ int a[100]={0}; int i=0,k=0; int n=10; cout<<"請輸入洞穴的數量n:";cin>>n; if(n>=100) { cout<<"不好意思,您輸入的洞穴數量有些多,請輸入一個小於100的數吧"<<endl; cin>>n; } for(i=1;i<=1000;i++) {//設定迴圈的次數,也就是狐狸找兔子的次數 k=(k+i)%n;//因為洞穴圍成了一個圈 if(k==0)k=n;//當k為0的時候,說明可以整除 a[k]=1;//將數組值設定為1,表示這個洞狐狸已經進入過了 } for(i=1;i<=n;i++){ if(a[i]!=1){ cout<<"\n洞穴"<<i<<"安全"<<endl; } }cout<<endl; return 0;}
程式運行介面: