目录
一:问题
二:思路分析
三:代码
一:问题
二:思路分析
1.输出结果是按编号输出,所以要考虑数组,数组里面存的数是有编号的,所以把n个人放到数组中,让他们的编号也是1~n,数组大小未知,有提示的数据范围可将数组设计在大于1000的范围
2.我们要区分报数的人是不是具有报数的能力,即他之前没有报到过m,所以我们可以通过数组的值区分这个人是否可以报数,默认初始值是零,均可以报数,当一个人报到m是,将里面的值置为1,并将下标打印出来
3.结束的标志是,n =0,所以每打印一个下标n--,知道n=0,程序结束
4.在程序中我们设一个i作为下标,上来i先加一,从一开始,循环每执行一次,不管该下标是否可以报数,再次进入循环是i都要+1,此时就会出现一个问题一共有n个人,当i超过n呢?此时会循环从一开始在接着报数,所以i>n是,i = 1,重新从一开始判断
三:代码
#include <stdio.h>
//2037约瑟夫问题
int main()
{int arr[1005] = { 0 };int n = 0, m = 0;scanf("%d %d", &n, &m);int num = n;int i = 0;int s = 0;//统计报数while (num){i++;if (i > n)i = 1;if (arr[i] == 0){s++;if (s == m){num--;arr[i] = 1;s = 0;printf("%d ", i);}}}return 0;
}