解法一:
- #include <stdio.h>
- #define MaxSize 8
- void king(int m,int n)
- {
- int p[MaxSize];
- int i,j,t;
- for (i=0; i<m; i++) //構建初始序列,記錄m只猴子在圈中
- p[i]=1;
- t=-1; //首次報數將從起始位置爲0,即第1只猴子開始,因爲在使用p[t]前t要加1
- printf("出列順序:");
- for (i=1; i<=m; i++) //循環要執行m次,有m個猴子要出圈
- {
- j=1; // j用於報數
- while(j<=n) //
- {
- t=(t+1)%m; //看下一隻猴子,到達最後時要折回去,所以用%m
- if (p[t]==1) j++; //等同於if (p[t]==1) j++;僅當q猴子在圈中,這個位置才報數
- }
- p[t]=0; //猴子出圈
- printf("%d ",t+1); //輸出出圈猴子的編號
- }
- printf("\n");
- }
- int main()
- {
- int m,n;
- scanf("%d %d", &m, &n);
- king(m,n);
- return 0;
- }
- #include <stdio.h>
- #define MaxSize 8
- void king(int m,int n)
- {
- int p[MaxSize];
- int i,s=0,t;
- for (i=0; i<m; i++) //構建初始序列,記錄m只猴子在圈中
- p[i]=1;
- t=0; //首次報數的起始位置爲0,是第1只猴子
- printf("出列順序:");
- for (i=1; i<=m; ) //循環要執行m次,有m個猴子要出圈
- {
- s=s+p[t]; //s累加中,猴子在圈時加1相當於報數,出圈後是加0相當於沒有報數。
- if(s==n)
- {
- p[t]=0; //猴子出圈
- printf("%d ",t+1); //輸出出圈猴子的編號
- s=0; //重新開始累加
- i++; //報數的猴子加1
- }
- t=(t+1)%m; //再報數時,從下一隻猴子開始
- }
- printf("\n");
- }
- int main()
- {
- int m,n;
- scanf("%d %d", &m, &n);
- king(m,n);
- return 0;
- }
- #include <stdio.h>
- #define MaxSize 100
- void king(int m,int n)
- {
- int p[MaxSize];
- int i,j,t;
- for (i=0; i<m; i++) //構建初始序列,記錄m只猴子在p[0]~p[m-1]中
- p[i]=i+1;
- t=0; //首次報數的起始位置爲0
- printf("出列順序:");
- for (i=m; i>=1; i--) //循環要執行m次,有m個猴子要出圈;共有i從m開始遞減至1,i還表示在圈中猴子的數目
- {
- t=(t+n-1)%i; //從t開始數1,其後第n-1個將數到n,t加n-1用%i取餘,目的是到達最後一個猴子可以折回去繼續數
- printf("%d ",p[t]); //編號爲p[t]的元素出列
- for (j=t+1; j<=i-1; j++)//後面的元素前移一個位置,刪除了編號爲p[t]的猴子
- p[j-1]=p[j];
- }
- printf("\n");
- }
- int main()
- {
- int m,n;
- scanf("%d %d", &m, &n);
- king(m,n);
- return 0;
- }
運行結果:
知識點總結:
通過數組解決問題。
學習心得:
第一種數到最後一隻猴子時需折回到下標爲零的位置,第二種設置了一個累加的變量,第三種則還需要將數據覆蓋到前面。