1.問題及代碼
在一個數組中,數組中用1表示猴子在圈中,用0表示猴子已經出圈,數組下標對應與猴子編號對應(例如數組元素p[0]值爲1,表示第1只猴子尚在圈中,即p[i]代表編號爲i+1的猴子是否在圈中)。
一隻猴子出圈,則將對應的數組值置爲0;在報數過程中,要跨過值爲0的猴子。
若m=8, n=4,初始時數組如下:
其中有3只猴子出圈後,數組中的值如下:
數到最後一隻猴子時需要折回到下標爲0的位置,猴子出圈後,還將對應元素的值置爲0。見代碼註釋。
01.#include <stdio.h>
02.#define MaxSize 8
03.void king(int m,int n)
04.{
05. int p[MaxSize];
06. int i,j,t;
07. for (i=0; i<m; i++) //構建初始序列,記錄m只猴子在圈中
08. p[i]=1;
09. t=-1; //首次報數將從起始位置爲0,即第1只猴子開始,因爲在使用p[t]前t要加1
10. printf("出列順序:");
11. for (i=1; i<=m; i++) //循環要執行m次,有m個猴子要出圈
12. {
13. j=1; // j用於報數
14. while(j<=n) //
15. {
16. t=(t+1)%m; //看下一隻猴子,到達最後時要折回去,所以用%m
17. if (p[t]==1) j++; //等同於if (p[t]==1) j++;僅當q猴子在圈中,這個位置才報數
18. }
19. p[t]=0; //猴子出圈
20. printf("%d ",t+1); //輸出出圈猴子的編號
21. }
22. printf("\n");
23.}
24.
25.int main()
26.{
27. int m,n;
28. scanf("%d %d", &m, &n);
29. king(m,n);
30. return 0;
31.}
2.運行結果
3.知識總結
數組的運用。
4.學習心得