2037约瑟夫问题(C语言)
2023-12-14 15:52:58
目录
一:问题
二:思路分析
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;
}
文章来源:https://blog.csdn.net/2301_80096514/article/details/134994125
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!