一隻兔子躲進了 10 個環形分布的洞的某一個,狼在第一個洞沒有找到兔子,就隔一個洞,到第三個洞去找,也沒有找到,就隔兩個洞,到第六個洞去找,以後每次多隔一個洞 去找兔子……這樣下去,結果一直找不到兔子,請問:兔子可能躲在哪個洞中?
演算法思想
對於本範例中提到的問題,雖然是“兔子可能躲在哪個洞中”,但是在考慮演算法時,需要知道的是狼會去哪個洞找兔子,狼第一次去的洞是第一個(表示為 pos1),第二次去的是第三個(pos3),把它去的洞的程式碼用數位表示出來,可以推匯出狼去的洞的程式碼是: pos(i+1)=pos(i)+i+1。
由題目可知,狼沒有找到兔子,因此該演算法會一直持續下去。除此之外,還需要注意的是,在 10 個洞之後,比如狼去找第十五個洞,但第十五個洞是不存在的,因此我們用 15 對 10 求餘,得到的數位才是洞的標示。
程式程式碼
#include <stdio.h>
int main()
{
int i;
bool pos[10]={0};
int lang=0;
for(i=0;i<100;i++)
{
pos[lang]=true;
lang++;
lang+=i;
lang=lang%10;
}
for(i=0;i<10;i++)
if(!pos[i])
printf("兔子可能在第%d洞中n",i+1);
return 0;
}
偵錯執行結果
通過上面的演算法分析,狼在找兔子的過程中,為了達到找到兔子的目的,同時為了設計需要,增加了迴圈次數,最終程式的結果如下所示:
兔子可能在第3洞中
兔子可能在第5洞中
兔子可能在第8洞中
兔子可能在第10洞中
總結
(1) 一維陣列定義時需要注意的規則:
① 陣列名的命名規則遵守識別符號的命名規則。
② 常數表示式指出陣列的長度,當長度為 n 時,即陣列為 n 個元素,陣列元素下標範圍只能是 0~(n—1),即陣列中第一個元素的下標為 0,陣列中最後一個元素的下標應該是(n—1)。
③ 常數表示式可以包含常數和符號常數,但是不能包含變數。
④ 在定義陣列的說明中,可以有多個陣列說明符,用逗號隔開即可。
(2) 一維陣列的參照說明:
① 陣列下標可以是整型常數、整型變數或者整型表示式,初始值為 0。
② 一個陣列元素參照的實質就是一個變數名的參照,每一個陣列元素代表記憶體中的一個儲存單元,具有與相同型別單個變數一樣的屬性,可以對它進行賦值且參與各種運算,一個陣列佔有一段連續的儲存單元。
③ 在 C 語言中,陣列不能作為一個整體參加資料運算,只能對單個元素進行計算。