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.学习心得