约瑟夫问题求解

约瑟夫问题描述:

  41个人坐一圈,轮流报数从1到3,数到3的人,自动出局,最后没出局的两人是谁?

算法思想:

  ①坐一圈 采用循环数组 i = i % LEN;

  ②有出局的和没出局的 采用个计数器 一个记录 在所有人的位置,

                另一个记录  在未出局的人中的位置;

 1  1 #include<stdio.h>
 2  2 #define LEN 41
 3  3 #define STEP 3
 4  4 int main(){
 5  5     int pos = 1,count=0,i=0;
 6  6     int arr[LEN];
 7  7     for(i=0;i<LEN;i++)arr[i]=0;
 8  8     for(i=0;count < LEN - LEN % STEP;i++){    //i外层 在数组中的位置
 9  9         if(0 == arr[i%LEN]){
10 10             if(3 == pos){                    //pos 活着的人口中的数字
11 11                 arr[i % LEN] = 1;
12 12                 count++;                    //count 作为 死亡人数统计 确保 循环可以正常结束
13 13                 pos = 0;
14 14             }
15 15             pos++;
16 16         }
17 17     }
18 18     for(i=0;i<LEN;i++)if(0 == arr[i])printf("%d\n",i+1);
19 19     return 0;
20 20 }                                                                                                    
时间: 2024-08-28 01:06:32

约瑟夫问题求解的相关文章

约瑟夫问题求解算法的设计与实现

一.实验内容 约瑟夫(Joseph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止.试设计一个程序求出出列顺序. 二.实验目的 掌握链表的基本操作:插入.删除.查找等运算,能够灵活应用链表这种数据结构. 一.需求分析 1.输入的形式和输

约瑟夫问题的求解——利用循环链表

约瑟夫问题--利用循环链表求解 1. 约瑟夫问题的提法 约瑟夫问题(约瑟夫环)是一个数学的应用问题. 已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列. 通常解决这类问题时我们把编号从1~n,最后结果编号即为原问题的解. 2. 求解约瑟夫问题的算法原理示例 注:n=8,m=3的约瑟夫问题示例,若n=8,k=1,m=3,则出列的顺序将为3,6,1,5

约瑟夫环问题求解

问题描述:已知n个人,分别以编号1,2,3,...n表示,围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列,求最后一个出列人的编号. 一般性递归算法思考:n个人围成一圈,从k开始以m为步长报数,第(k+m)-1个人出列:于是转化为n-1个人围成一圈,从(k+m-1)+1开始以m为步长报数,第(k+m)+m-1个人出列:再转化为求n-2个人围成一圈,从(k+2m-1)+1开始以m为步长报数,

CSP-S 初赛问题求解与选择题

# CSP-S 初赛问题求解与选择题 ## 时间复杂度计算 公式:对于 $T(n) = a \times T(\dfrac{n}{b})+O(n^d)$ 这个递推式,其时间复杂度为:$$T(n) = \begin{cases}O(n^{\log_b a}) , \ a > b^d \\\\O(n^d \lg n) , \ a = b^d \\\\O(n^d) , \ a<b^d\end{cases}$$ ## 鸽巢原理 ### 基本定义 若有 $n$ 个鸽巢,$n+1$ 只鸽子,则至少有一个鸽

一个不简洁的约瑟夫环解法

约瑟夫环类似模型:已知有n个人,每次间隔k个人剔除一个,求最后一个剩余的. 此解法为变种,k最初为k-2,之后每次都加1. 例:n=5,k=3.从1开始,第一次间隔k-2=1,将3剔除,第二次间隔k-1=2,将1剔除.依此类推,直至剩余最后一个元素. 核心思路:将原列表复制多份横向展开,每次根据间隔获取被剔除的元素,同时将此元素存入一个剔除列表中.若被剔除元素不存在于剔除列表,则将其加入,若已存在,则顺势后移至从未加入剔除列表的元素,并将其加入.如此重复n-1次.面试遇到的题,当时只写了思路,没

【c语言】数据结构(约瑟夫生者死者游戏的问题)

约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分:因此船长告诉大家,只有将全船一半的旅客投入海中,其余人才能幸免遇难.无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止.问哪些位置是将被扔到大海的位置. 解法有许多种,可以用数组,应为涉及到删除操作,数组(顺序线性表)比较麻烦,但不必要删除,只需要给跳船的人(元素

算法系列:约瑟夫斯问题

约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有{\displaystyle n}个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过{\displaystyle k-2}个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过{\displaystyle k-1}个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着. 问题是,给定了{\displaystyle n}和{

ytu 1067: 顺序排号(约瑟夫环)

1067: 顺序排号Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 31  Solved: 16[Submit][Status][Web Board] Description 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. Input 初始人数n Output 最后一人的初始编号 Sample Input 3 Sample Output 2 HINT Source freepro

约瑟夫环 C语言 单循环链表

/*---------约瑟夫环---------*/ /*---------问题描述---------*/ /*编号为1,2,-,n的n个人围坐一圈,每人持一个密码(正整数). 一开始任选一个正整数作为报数上限值m, 从第一个人开始自1开始顺序报数,报到m时停止. 报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数, 如此下去,直至所有人全部出列为止.试设计一个程序求出列顺序.*/ /*---------问题分析---------*/ /*n个人围坐一圈,且不断有人出列,即频繁