c语言实现约瑟夫环

c语言实现约瑟夫环一般有循环链表和数组模拟两种方式 貌似还有递归实现的呢 这里主要介绍数组模拟方式 一 最简单的约瑟夫环问题约瑟夫环是一个数学的应用问题 已知 n 个人 以编号 1 2 3 n 分别表示 围坐在一张圆桌周围 从编号为 1 的人开始报数 数到 m 的那个人出列 他的下一个人又从 1 开始报数 数到 m 的那个人又出列 依此规律重复下去 直到圆桌周围的人全部出列 如果用数组模拟这个过程 就要考

 一般有循环链表和数组模拟两种方式,貌似还有递归实现的呢!这里主要介绍数组模拟方式。

一. 最简单的约瑟夫环问题

       约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

如果用数组模拟这个过程,就要考虑两个问题:

1.怎样实现尾部和头部的无缝连接这个循环过程?

          意思就是当第n个人报完数时,下一个报数的应该又是1而不是n+1。如果用循环链表确实好做,但用数组的话可以通过while+for来实现,来看看。

while(1){ for(int i=1;i<=n;i++) cout<<i<<" "; }

 这段程序可以不断地输出1到n的所有值,这不就完成了尾部和头部的无缝连接嘛,我们只需将条件改改就行了。

2.怎么模拟数到m这个过程?

          开始时把所有的值状态标记为1,代表这个人在循环的队列中。我们可以不断地遍历这n个值,每当遇到在队列中的人时,计数器num++(这个计数器num只在遇到status[i]==1时自增),当num==m时,这个人出列,计数器清0,状态标记为0(代表这个人出列了,不在循环的队列中),同时用来记录出列人数的count++。当count==n时,n个人已经全部出列,可以退出for和while了。

代码如下:

#include<bits/stdc++.h> const int maxn = 1111; using namespace std; int main(){ int n,m; int status[maxn]; int count = 0; int num = 0; cin>>n>>m; memset(status,0,sizeof(status)); for(int i=1;i<=n;i++) status[i] = 1; while(count<n){ for(int i=1;i<=n;i++){ if(status[i] == 1) num++; if(num == m){ cout<<i<<" "; status[i] = 0; count++; num = 0; } if(count == n) break; } } return 0; } 

二. 简单的约瑟夫环问题

        这个问题和上面的一样,不过这里的问题变成了每个人有一个可以输入的编号,而不再是1~n这样编号了。其实本质和上面是一样的,无非是加一个sum[ ]数组记录这n个人的编号罢了,输出的时候不再输出i了,而是输出i对应的编号sum[ i ]。

直接瞧代码吧:

#include<bits/stdc++.h> const int maxn = 1111; using namespace std; int main(){ int n,m; int status[maxn]; int sum[maxn]; int count = 0; int num = 0; cin>>n>>m; memset(status,0,sizeof(status)); for(int i=1;i<=n;i++) cin>>sum[i]; for(int i=1;i<=n;i++) status[i] = 1; while(count<n){ for(int i=1;i<=n;i++){ if(status[i] == 1) num++; if(num == m){ cout<<sum[i]<<" "; status[i] = 0; count++; num = 0; } if(count == n) break; } } return 0; } 

三.稍稍复杂一丢丢的约瑟夫环问题

        这个问题又比上面问题多了一个条件,从第k个人开始报数而不是从1开始报数。那么完整问题是:已知n个人(这n个人的编号可以自己输入)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

实现这个只需要在第二个问题的基础上加上一个flag就行了,具体的窍门自己看,直接上代码:

#include<bits/stdc++.h> const int maxn = 1111; using namespace std; int main(){ int n,m,k; int status[maxn]; int sum[maxn]; int count = 0; int num = 0; int flag = 0; cin>>n>>m>>k; memset(status,0,sizeof(status)); for(int i=1;i<=n;i++) cin>>sum[i]; for(int i=1;i<=n;i++) status[i] = 1; while(count<n){ for(int i=1;i<=n;i++){ if(i == k) flag=1; if(flag==0) continue; if(status[i] == 1) num++; if(num == m){ cout<<sum[i]<<" "; status[i] = 0; count++; num = 0; } if(count == n) break; } } return 0; } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231765.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月23日 上午10:01
下一篇 2025年11月23日 上午10:22


相关推荐

  • 什么是多态?为什么使用多态?什么时候使用多态?

    什么是多态?为什么使用多态?什么时候使用多态?在学习多态的过程中 发现书籍和网上大部分文章都是在讲多态的概念 但什么时候用呢 又为什么用呢 就不得而知了 我找了很多资料 结合自己的理解 特总结出这篇文章 和大家分享 1 什么是多态编程中多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定 而是在程序运行期间才确定 即一个引用变量倒底会指向哪个类的实例对象 该引用变量发出的方法调用到底是哪个类中实现的

    2026年3月17日
    2
  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

    2022年6月30日
    21
  • sequencer是什么意思_centralism

    sequencer是什么意思_centralismsequencer产生transaction,而driver负责接收transaction。classmy_driverextendsuvm_driver#(my_transaction);

    2022年8月1日
    10
  • dos窗口编译java程序命令_dos编译java

    dos窗口编译java程序命令_dos编译java随着RESTful风格的接口普及,程序员默认都会使用json作为数据传递的方式。json格式的数据冗余少,兼容性高,从提出到现在已被广泛的使用,可以说成为了Web的一种标准。无论我们服务端使用什么语言,我们拿到json格式的数据之后都需要做jsonDecode(),将json串转换为json对象,而对象默认会存储于HashTable,而HashTable很容易被碰撞攻击。我只要将攻击数据放在j…

    2026年4月14日
    4
  • ILRuntime学习[通俗易懂]

    ILRuntime学习[通俗易懂]ILRuntime介绍ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新ILRuntime优势访问C#工程的现成代码,无需额外抽象脚本API直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net4.6编译的DLL执行效率是L#的10-20倍选…

    2025年7月30日
    9
  • JS时间戳转换

    JS时间戳转换时间戳转换页面实现功能 有需要的同学可以直接到仓库下载 https github com MYX

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号