C语言解决经典问题约瑟夫环--数组
什么时约瑟夫环问题?
约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。
问题的大致内容就是:一共有N个人,从1开始报数,报到p的人出局,之后下一个人再从1开始报数,同样报到p的人出局,直到只剩最后一个人为止,那剩下的这一个人就是胜利者。
示例图:
此图中,外围数字为对应人的出出局顺序
当然原问题是比较简单的,那如果按退出顺序输出每个退出人的原序号该怎么实现呢?
问题分析:
1、如何判断出局
这里我们可以定义一个数组(长度视情况而定)可以将数组初始化为0,定义k来表示数组成员的报数,每次循环时k++,然后判断k是否等于p,若等于p则让arr[i] = 1;那么下次循环时判断arr[i]的值,若为1则跳过该元素。
2、如何循环
在此问题中,不是简单的对数组进行遍历,所以再想用for(i = 0;i <n;i++)显然是行不通的,
那我们该如何进行循环呢?
这里我们定义count来记录已经淘汰的人数,当淘汰人数count = n时则结束循环。
那么新的问题又出现了,当进行到最后一个人时如何返回从第一个人开始呢?
3、如何返回重新开始
其实这个问题不难解决,我们可以定义一个temp = n,在循环的最后判断i的值,如果i==temp,
这令i=0;就可以重新开始了。
OK主要问题就分析完了,话不多说,直接上代码。
代码:
#include <stdio.h>
#define N 3000void joseph(int *arr,int n,int p);
int main()
{int arr[N] = {0};int n,p;printf("请输入参加人数n和淘汰条件:");scanf("%d %d",&n,&p);printf("淘汰循序: ");joseph(arr,n,p);return 0;
}
void joseph(int *arr,int n,int p)
{int count,k,i,b;count = 0; //记录出局的人数 k = 0; //每个成员报的数i = 0;int temp;temp = n;/*这里定义temp的值为总人数是为了当数组遍历到最后一个后再回到第一个即:当 i == temp时 令 i = 0; */ while(count < n){if(arr[i] == 0){k++;if(k == p){arr[i] = 1;b = i+1;printf("%d ",i+1);count++;k = 0;}}i++;if(i == temp){i = 0;} }}
C语言解决经典问题约瑟夫环--数组相关推荐
- 2018沈阳k(经典的约瑟夫环)
地址 K Let the Flames Begin 首先,对于经典的约瑟夫环问题,我们记f(n,m)f(n,m)f(n,m)表示初始有nnn个人,第mmm个出队的人是谁(从0号开始报数).则有递推式f ...
- c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题
N个人围成一圈 - phpStudy...
详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...
- 【算法经典】 约瑟夫环问题
[前言]本文讨论经典算法问题约瑟夫环问题的递归解法. 一.问题描述 作为算法中的经典问题,约瑟夫环问题自诞生以来有各种各样的变种描述,丢手绢.游戏获胜者.圆圈中最后剩下的数字.点名游戏等等,但都是同样 ...
- C语言 (编程题:约瑟夫环 报数游戏)
1.前言 最近有点emo,写博客也没有什么特别想写的内容 这篇博客把约瑟夫环用C语言来写一下 巩固一下原来学过的知识. 2.什么是约瑟夫环 这有个历史故事还是比较有意思的:据说著名犹太历史学家Jose ...
- 约瑟夫环-(数组、循环链表、数学)
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出 ...
- python约瑟夫环_Python语言之如何实现约瑟夫环问题
本文Python语言实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,希望对大家学习Python语言有所帮助,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0 ...
- 约瑟夫环双向链表c语言实,双向链表与约瑟夫环代码
双向链表 //注意:该文件操作的链表为带头结点双向链表,头结点数据为-1 #include #include #include #define OK 1 #define ERROR 0 typedef ...
- 猫抓老鼠c语言程序,猫抓老鼠问题C++实现一例(约瑟夫环问题)
今天偶然在网上看到了猫抓老鼠问题, 当时也没多想,只觉得网上给出的程序的确有很多需要改进的地方, 就闷头闷脑的用 循环链表 和 递归 写了一个算法实现,后来发现 这个问题实际上是经典的约瑟夫环问题的变 ...
- 约瑟夫环问题(递推公式)
约瑟夫环问题在==<具体数学>==一书上讲得十分详细 基本问题描述: 已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人 ...
最新文章
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
- 【数据中台】关于数据中台系统,需要了解哪些技术?
- 算法导论之动态规划(最长公共子序列和最优二叉查找树)
- C++代码片段(一)萃取函数返回值类型,参数类型,参数个数
- 99.999%,提升ElasticSearch稳定性的秘密
- [文摘20080428]无线局域网的相关网络安全技术应用指南
- AviSynth——多种字幕效果伪实现方法
- 【hive】hive权限
- 阿里云服务器18个数据中心测试IP地址以及测试方法
- STM32工作笔记0074---UCOSIII 任务管理(中)
- sklearn中的Linear_model的score函数讲解
- 使用PO+跨平台改造Macaca示例(APP端)
- 2020级C语言大作业 - 丛林大作战
- [转载] python异常和错误有什么区别_python的错误和异常
- 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
- 【数学逻辑思维】A 好玩的数独游戏——002
- 商品分类无限层级递归
- Excel一键取消合并单元格并向下填充相同的内容
- kappa一致性检验教程_[转载]Kappa一致性检验
- 监控你的App使用行为