今天小编给大家分享以下约瑟夫环问题的处理。
一.题目描述
有 n 个人围成一圈,顺序排号。 从第 1 个人开始报数,从 1 到 3 报数,凡是报到 3 的人退出圈子,问最后留下的是原来的第几号?
这是一个典型的约瑟夫环的问题。
二.思路分析
难点一:我们如何表示人退出圈子呢?
答:定义一个标记数组,如果是0表示孩子游戏,如果是1表示退出游戏
难点二:当一个人退出圈子,我们如何重新计数?
答:环形处理,比如数组的下标是i,人数是n,我们用(i+1)%n来环形处理
三.完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //引用头文件
int main()
{
int arr[20] = { 0 };//定义一个标记数组,还在参与游戏的表示0,退出游戏的表示1
int n;//表示游戏的参与人数
printf("请输入参与游戏的人数 :");
scanf("%d", &n);
int person = n;//定义还在参与游戏的人数
int count = 0;//定义报数器,如果报数为3,把标记数组赋值成1
int i = 0;//标记数组的下标
//当游戏的人数==1时循环结束
while (person == 1)
{
//当标记数组的值为0时,游戏继续,可以报数
if (arr[i] == 0)
{
count++; //开始报数
if (count == 3)
{
//当报数报到3时,有3个要处理的部分:
//1.要把标记数组赋值成1
//2.游戏的人数要减一,即person--
//3.要重新开始报数,count=0
arr[i] = 1;
person--;
count = 0;
}
i = (i + 1) % n;
}
for (int i = 0;i < n;i++)
{
if (arr[i] == 0)
break;
}
}
printf("剩下的是第%d号", i + 1);
return 0;
}
四.运行结果
创作不易, 如果这份博客👍对你有帮助,可以给博主一个免费的点赞以示鼓励。
欢迎各位帅哥美女点赞👍评论⭐收藏,谢谢!!!
如果有什么疑问或不同的见解,欢迎在评论区留言哦👀。
祝各位生活愉快⭐