2037约瑟夫问题(C语言)

目录

一:问题

二:思路分析

三:代码


一:问题

2037约瑟夫问题(C语言)_第1张图片

二:思路分析

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,重新从一开始判断

三:代码

2037约瑟夫问题(C语言)_第2张图片

#include 
//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;
}

你可能感兴趣的:(题目讲解,c语言,开发语言,visual,studio,算法,数据结构,学习方法)