约瑟夫环问题_数组解决_C语言

这篇具有很好参考价值的文章主要介绍了约瑟夫环问题_数组解决_C语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一_题目

有n个人围成一个圈,开始报数,报到m的人出局,并且不再参加报数,依次类推,直到n个人全部出局为止。

二_分析

1.将抽象的问题实例化

假设有一个裁判:

mouth:取值范围 1~m (报到m的人出局)

finger: 取值范围1~n   (总共有n个人)

约瑟夫环问题_数组解决_C语言,C语言阶段相关习题总览,算法,c语言

2.对n,m赋值,个人模拟报数

假设

n==8    ,  m==5

那么出局的人的依次是:   5      2       8        7       1        4         6        3

3.从个人模拟报数中发现问题

代码如下:(具体解释在代码注释中)

int n=0;  //参加报数的总人数 
int m=0;  //报到m的人出局

scanf("%d",&n);
scanf("%d",&m); 
//输入完毕 

int table[1005]={0};  //数据规模可以开大一些 
for(int i=1;i<=n;i++)  //将数组中的人先全部标号为 1 ,之后出局的人标号为 0 
{
	table[i]=1;
 } 
 
 //开始操作
 int mouth=0;  //1~m    //mouth==m怎么办? 
 int finger=0;  //1~n   //table[finger]==0  怎么办? 

易发现,问题的关键在于:

Ⅰ.mouth==m怎么办?

Ⅱ.table[finger]==0怎么办?

将以上两个问题思考清楚了,这个问题也就解决了。

4.解决问题

在代码中具体操作(多说无益,在问题中解决问题):

 int cnt=n; //cnt需要实现--的操作,以结束代码 
 while(cnt!=0)  //表示还有人在参加报数
 {
 	mouth++;
 	finger++;
 	while(table[finger]==0)  //如果指到空位了的操作 
 	{
 		finger++;  //不管这个空位,finger继续++ 
 		if(finger>n)  //finger超过了总人数 
 		{
 			finger=1;  //重新将finger赋值为  1 
		 }
	 }
	 if(mouth==m)  //有人报到m这个数了,需要出局 
 	{
 		printf("%d ",finger);  //打印出局的人的编号
 		table[finger]=0;  //将出局的人标号为  0  ,表示不再参加报数 
		 cnt--;  //参加报数的人 --
		 mouth = 0;  //更新 mouth 的值 
	 }
 	
  } 

三_总结

可以解决约瑟夫环问题的方法有很多种:

如,递归,链表等等。

本文仅仅介绍最为简单的一种(数组),学会本文万不可妄自菲薄,知识海洋深不见底,无人可窥之全貌。

下面将全部代码附上,请君观之,如有不足敬请指点

#include<stdio.h>
int main()
{
  
int n=0;  //参加报数的总人数 
int m=0;  //报到m的人出局

scanf("%d",&n);
scanf("%d",&m); 
//输入完毕 

int table[1005]={0};  //数据规模可以开大一些 
for(int i=1;i<=n;i++)  //将数组中的人先全部标号为 1 ,之后出局的人标号为 0 
{
	table[i]=1;
 } 
 
 //开始操作
 int mouth=0;  //1~m    //mouth==m怎么办? 
 int finger=0;  //1~n   //table[finger]== 0  怎么办? 
 int cnt=n; //cnt需要实现--的操作,以结束代码 
 while(cnt!=0)  //表示还有人在参加报数
 {
 	mouth++;
 	finger++;
 	while(table[finger]==0)  //如果指到空位了的操作 
 	{
 		finger++;  //不管这个空位,finger继续++ 
 		if(finger>n)  //finger超过了总人数 
 		{
 			finger=1;  //重新将finger赋值为  1 
		 }
	 }
	 if(mouth==m)  //有人报到m这个数了,需要出局 
 	{
 		printf("%d ",finger);  //打印出局的人的编号
 		table[finger]=0;  //将出局的人标号为  0  ,表示不再参加报数 
		 cnt--;  //参加报数的人 --
		 mouth = 0;  //更新 mouth 的值 
	 }
 	
  }
  return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-769711.html

谢谢观看!

 

 

 

 

 

到了这里,关于约瑟夫环问题_数组解决_C语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 约瑟夫环问题解决

    单链表 实现 错例 在使用malloc函数开辟的空间中,不要进行指针的移动, 因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配 循环链表 单独创建 逐节点创建 约瑟夫环问题 实现方式一: 实现方式二: 删除节点并建立新链表 实现

    2024年02月02日
    浏览(28)
  • C语言 | 约瑟夫问题(猴王争夺战)

             约瑟夫问题有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。下面我们将用猴子争大王这一故事以及采用单向循环链表这一方法来进行讲解这一问题。         设编号为1,2,……n得n个猴子围

    2024年02月01日
    浏览(26)
  • 数据结构—约瑟夫环问题(C语言版)

    目录 首先什么是约瑟夫环 约瑟夫环实现方式 一、创建结构体变量 二、初始化链表 三、构建循环链表 四、删除链表  五、完整代码及注释讲解 约瑟夫环 是 循环链表 中的一个经典问题;题目描述:n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新

    2024年02月11日
    浏览(32)
  • 循环链表解决约瑟夫环问题

    n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 n个人围成一圈,很容易可以想到用循环链表解决问题,用结点代表每个人,节点的数据域存储人的编号

    2024年02月07日
    浏览(31)
  • 4种方法解决约瑟夫环问题

            约瑟夫环问题是大多数编程初学者必须要跨越的一道坎。在第一次见到它的时候,我还是个刚刚学会循环语句的小蒟蒻,而现在的我已经是深陷图论以及各种其他算法的大蒟蒻了(bushi)。可以说,约瑟夫环问题是我从编程基础向编程思维踏出的重要一步。        

    2024年02月12日
    浏览(26)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(35)
  • 约瑟夫问题

    约瑟夫问题是一个经典的数学问题,也是计算机科学中常见的数据结构和算法题目之一。它的形式是:有n个人站成一排,从第一个人开始报数,每次报到m的人出列,直到所有人都出列为止。请问,最后留下的人原来在什么位置上? 这个问题可以用多种方法解决,其中包括使

    2023年04月09日
    浏览(20)
  • 约瑟夫环问题

    n n n 个人围成一圈,从第一个人开始报数,数到 m m m 的人出列,再由下一个人重新从 1 1 1 开始报数,数到 m m m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n − 1

    2024年02月02日
    浏览(23)
  • 【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《数据结构与算法:初学者入门指南》📘📘 本专栏纯属为爱发电永久免费!!! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://su

    2024年02月19日
    浏览(30)
  • 神奇的约瑟夫环(C语言)

    约瑟夫环是一个古老而有趣的问题,它涉及人与人之间的生死较量,引发了人们长久以来的思考和探索。这个问题可以通过不同的方式来解决,每种方式都有其独特的优缺点。 使用数组实现约瑟夫环可以简单直观地表示人员的顺序,但受到数组大小静态限制和数据复制的操作

    2024年02月13日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包