约瑟夫环问题当前位置移到最后,怎么处理?如何判断

约瑟夫环课程设计_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
约瑟夫环课程设计
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢共有 3168 人关注过本帖
标题:约瑟夫环的递归写法
来 自:水星
等 级:ID已被封
帖 子:1868
&&问题点数:0&&回复次数:22&&&
约瑟夫环的递归写法
谁有约瑟夫环的递归写法&&2个铜板买
实在想不起来
[[it] 本帖最后由 liyanhong 于
18:07 编辑 [/it]]
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:788
为了实现零突破,给你了.
C++写得要不要.
i like linux...
等 级:新手上路
帖 子:788
哈哈,不好意思,没仔细看题,我写得是非递归.
你再说一句要就给你了.
i like linux...
等 级:新手上路
帖 子:788
//工程是大了点,没办法,C++就是这样,当然,也可以写得短小精悍.
//这次写用的是循环链表,效率不高,适合初学者.
//一共三个文件
//////////////////////////////////////////////////////////////////////////////////////////////
template&typename T&
class CNode
&&&&CNode&T& *&&&&&&&&&&&&&&&&&&&&&&&&&&&//指向下一节点循环指针
&&&&CNode();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //construct
&&&&CNode(const T & item);
&&&&//更新表的方法
&&&&void InsertAfter(CNode&T& *p);
&&&&CNode&T&*DeleteAfter();
&&&&//保存下一节点的指针
&&&&CNode&T& *NextNode()
////////////////////////////////////////////////////////////////////
//CNode.cpp
#include &CNode.h&
template&typename T&
CNode&T&::CNode()
&&&&next=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //下一节点为结点本身
//产生空表并初始化数据的构造函数
template&typename T&
CNode&T&::CNode(const T& item)
&&&&//将结点指向自身并初始化数据
//在当前结点之前插入结点P
template&typename T&
void CNode&T&::InsertAfter(CNode&T& * p)
&&&&//p指向当前结点的后继结点,当前结点指向P
&&&&p-&next=
&&&&next=p;
//删除当前结点之后的结点,并返回指向其的指针
template&typename T&
CNode&T&*CNode&T&::DeleteAfter()
&&&&//保存指向被删除结点的指针
&&&&CNode&T& *tempPtr=
&&&&//若next==this ,表明没有其他结点,返回NULL
&&&&if(next==this)
&&&&&&&&return NULL;
&&&&//当前结点指向tempPtr的后继结点。
&&&&next=tempPtr-&
&&&&//返回指向被删除结点的指针
&&&&return tempP
template&typename T&
CNode&T&* CNode&T&::NextNode()const
////////////////////////////////////////////////////////////
#include&iostream&
#include &CNode.h&
void CreateList(CNode&int& *header,int n)
&&&&//开始往头结点插入
&&&&CNode&int&*currPtr=header,*newNodeP
&&&&//建立起N元循环链表
&&&&for(i=1;i&=n;i++)
&&&&&&&&//用数据值i申请结空间
&&&&&&&&newNodePtr=new CNode&int&( i);
&&&&&&&&//往表尾插入结点并将currPtr指针前移到表尾
&&&&&&&&currPtr-&InsertAfter(newNodePtr);
&&&&&&&&currPtr=newNodeP
//对给定的n 元循环链表,通过每次便使第M个人出局直到最后一个末解决Josephus问题
void Josephus(CNode&int& *list,int n,int m)
&&&&CNode&int&*prevPtr=list,*currPtr=list-&NextNode();
&&&&CNode&int& *deleteNodeP
&&&&//删除表中结点只到最后一个
&&&&for(int i=0;i&n-1;i++)
&&&&&&&&//从CURRPTR指向的当前客人开始数人,即指针前移m-1次
&&&&&&&&for(int j=0;j&m-1;j++)
&&&&&&&&&&&&//前移指针
&&&&&&&&&&&&prevPtr=currP
&&&&&&&&&&&&currPtr=currPtr-&NextNode();
&&&&&&&&&&&&//若CURRPTR指向表头,再移一次指针
&&&&&&&&&&&&if(currPtr==list)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&prevPtr=currP
&&&&&&&&&&&&&&&&currPtr=currPtr-&NextNode();
&&&&&&&&&&&&}
&&&&&&&&cout&&&Delete person &&&currPtr-&data &&
&&&&&&&&//记录被删除的结点,并前移currPtr指针
&&&&&&&&deleteNodePtr=currP
&&&&&&&&currPtr=currPtr-&NextNode();
&&&&&&&&//从表中删除该结点
&&&&&&&&prevPtr-&DeleteAfter();
&&&&&&&&delete deleteNodeP
&&&&&&&&//若CURRPTR为头指针,则再移一次
&&&&&&&&if(currPtr==list)
&&&&&&&&&&&&prevPtr=currP
&&&&&&&&&&&&currPtr=currPtr-&NextNode();
&&&&cout&&endl&&&Person&&&currPtr-&data&&&Wins the cruise.&&&
&&&&//删除表中最后一个结点
&&&&deleteNodePtr=list-&DeleteAfter();
&&&&delete deleteNodeP
int main()
&&&&CNode&int&
&&&&int n,m;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//n为表中人数,M为循环选择因子
&&&&cin&&n;
&&&&CreateList(&list,n);
&&&&cin&&m;
&&&&cout&&&Generated the member&&&m&&
&&&&Josephus(&list,n,m);
&&&&system(&pause&);
&&&&return 0;
[[it] 本帖最后由 zjl138 于
12:14 编辑 [/it]]
果然适合新手
一看就明白。。 ...
i like linux...
等 级:贵宾
威 望:59
帖 子:3988
专家分:684
#include&stdio.h&
int main(void)
&&int m,n;
&&scanf(&%d%d&,&n,&m);
&&for(i=2;i&=n;i++) s=(s+m)%i;
&&printf(&%d\n&,s+1);
&&return 0;
这个是数学方法,我直接在贴中打的,因此可能有点小问题,不过算法就是这样。
[[it] 本帖最后由 卧龙孔明 于
12:35 编辑 [/it]]
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
等 级:新手上路
帖 子:58
为什么有优秀算法你不看,就偏要递归?
你觉得递归解这个很合适吗???
[color=white]
等 级:贵宾
威 望:59
帖 子:3988
专家分:684
递推应该是最快的了(不要铜板,那东西没有用)
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
来 自:水星
等 级:ID已被封
帖 子:1868
我一点算法都不懂呀
哪个好心人给个递归调用写出来的约瑟夫环
PS:我的机子开机20分钟左右就自动关机&&&是什么原因呢&&&无奈
爱上你 是 我的错&&可是离 开&&又舍不得&&听着你为我写的歌&&&&&好难过
如果说 我说如果&&我们还 能&&重新来过&&&不去计 较 谁对谁错&&会怎么做
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4497
专家分:141
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
int Josephus(int n,int q,int j,int k)
&&& if(j&n-1)
&&&&&&&&return 1;
&&&&&&while(p[i++]==1)
&&&&&&&&& i=i%n;
&&&&&&i=(i&n-1?(i-1)%n:i-1);
&&&&&&k++;
&&& if(k%q==0)
&&&&&&while(p[i++]==1)
&&&&&&&&& i=i%n;
&&&&&&&&&i=(i&n-1?(i-1)%n:i-1);
&&&&&&&&&printf(&第%d个元素出队.\n&,i);
&&&&&&&&&p[i]=1;
&&&&&&&&&j++;&&&&&&&&
&&&&&&&&i=(i++)%n;
&&& if(Josephus(n,q,j,k))
&&&&&&&&return 1;
&&&&&&&&return 1;
int main()
&&&printf(&请输入队列长度:&);
&&&scanf(&%d&,&n);
&&&printf(&请输入报数长度:&);
&&&scanf(&%d&,&q);
&&&p=new int[n];
&&&memset(p,0,n);
&&&Josephus(n,q,0,0);
&&&delete []
&&&return 0;
[[it] 本帖最后由 sunkaidong 于
15:52 编辑 [/it]]
学习需要安静。。海盗要重新来过。。
来 自:湖南长沙
等 级:新手上路
帖 子:237
你不是把自动关机的程序写到任务里面了吧
以前有人给我整了个,10分钟自动关机的
我还以为是木马什么的!整的累死了!
最后才知道是个恶作剧
我秀我自己
版权所有,并保留所有权利。
Powered by , Processed in 0.025590 second(s), 9 queries.
Copyright&, BCCN.NET, All Rights Reserved豆丁精品文档: 约瑟夫环问题 c语言接口与实现 c语言约瑟夫问题 c语言报数问题 算..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
c语言实现约瑟夫环问题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口约瑟夫环的实现(大作业)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
约瑟夫环的实现(大作业)
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢当前访客身份:游客 [
当前位置:
发布于 日 14时,
思路:假设七个人围城圈,数到三的人出局,将1~7放到ArrayList中,数到三,就将他移除,然后把他前面的两个人放到队伍的后边,这样三后边的人变成了第一个人,又他开始继续数,这样一个list就和相当于一个圆圈,循环以上步骤
代码片段(1)
1.&[代码][Java]代码&&&&
import java.util.ArrayL
import java.util.L
public class YueSeFu {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 4;//数到该数的出局
List list = new ArrayList();
for(int i=1;i&=7;i++){
list.add(i);
list = executor(count,list);
System.out.println(list.get(0));
public static List executor(int count,List list){
while(true){
System.out.println("size is "+list.size());
if(list.size()&=count){
for(int j=0;j&count-1;j++){
int a = (int) list.get(j);
list.add(a);
for(int i=0;i&i++){
list.remove(0);
}else{//当count&剩下的人的时候
int size = list.size();
for(int k=0;k&k++){
int temp = count-list.size();
if(list.size()==1){
for(int a=0;a&temp-1;a++){
int b = (int) list.get(a);
list.add(b);
for(int a=0;a&a++){
list.remove(0);
开源中国-程序员在线工具:
相关的代码(2682)
public static void main(String[] args) {
int m = 50;
int n = 3;
int[] group = new int[m];
for (int i = 0; i & 50; i++) {
group[i] = i + 1;
for (int i = 0, j = 0, leave = leave & 1; i++) {// i为点名数,死人也点,j为活人报数,leave为活着人数
int index = i % 50;// 位置编号
if (group[index] & 0) {// 当为活人时(当人死之后将置为-1)
j++; // 没死就要报数(从1开始)
if (j % n == 0) {// 报的数为3的倍数
System.out.print(index + & &);
group[index] = -1;// 将这个位置的人杀死
leave--;// 将剩下的人数减去1
System.out.println();
for (int i : group) {
if (i & 0) {
System.out.println(&最后的幸运者编号为:& + i);
2楼:wang_yueyang 发表于
就没有考虑过数学归纳吗?
3楼:wang_yueyang 发表于
&&&&&&&&int s = 0;
& & & & for (int i = 2; i &= i++) {
& & & & & & s = (s + n) %
4楼:MikasaLeslie 发表于
引用来自“covito”的评论public static void main(String[] args) {
int m = 50;
int n = 3;
int[] group = new int[m];
for (int i = 0; i & 50; i++) {
group[i] = i + 1;
for (int i = 0, j = 0, leave = leave & 1; i++) {// i为点名数,死人也点,j为活人报数,leave为活着人数
int index = i % 50;// 位置编号
if (group[index] & 0) {// 当为活人时(当人死之后将置为-1)
j++; // 没死就要报数(从1开始)
if (j % n == 0) {// 报的数为3的倍数
System.out.print(index + & &);
group[index] = -1;// 将这个位置的人杀死
leave--;// 将剩下的人数减去1
System.out.println();
for (int i : group) {
if (i & 0) {
System.out.println(&最后的幸运者编号为:& + i);
邪恶小法师-维嘉
5楼:月影南溪 发表于
可以使用单链环的结构做啊
6楼:首席404 发表于
import java.util.ArrayL
import java.util.L
public class YueSeFu {
public static I
public static void main(String[] args) {
Listlist = new ArrayList();
for( int i = 1; i &= 7; i++){
list.add(i);
executor(list);
System.out.println(result);
public static void executor(Listlist ){
for(int count = 1 ; count &= 3; count++){
if(count == 3){
list.remove(0);
//如果是第三个,将其移除
list.add(list.get(0));
//现将第一第二加入list,然后再将前面的移除
list.remove(0);
if(list.size()==1){
result = (Integer) list.get(0);
executor(list);
//使用递归
作为菜鸟的第一反应竟然是递归!!
7楼:biguoting 发表于
我之前写过一个该问题的文章,而且是扩展了该问题,不过是C#做的
/b5dfg/item/5ea96833ae1ae
8楼:琴麻岛 发表于
引用来自“wang_yueyang”的评论&&&&&&&&int s = 0;
& & & & for (int i = 2; i &= i++) {
& & & & & & s = (s + n) %
……我有些不明白,请明示
9楼:琴麻岛 发表于
引用来自“covito”的评论public static void main(String[] args) {
int m = 50;
int n = 3;
int[] group = new int[m];
for (int i = 0; i & 50; i++) {
group[i] = i + 1;
for (int i = 0, j = 0, leave = leave & 1; i++) {// i为点名数,死人也点,j为活人报数,leave为活着人数
int index = i % 50;// 位置编号
if (group[index] & 0) {// 当为活人时(当人死之后将置为-1)
j++; // 没死就要报数(从1开始)
if (j % n == 0) {// 报的数为3的倍数
System.out.print(index + & &);
group[index] = -1;// 将这个位置的人杀死
leave--;// 将剩下的人数减去1
System.out.println();
for (int i : group) {
if (i & 0) {
System.out.println(&最后的幸运者编号为:& + i);
10楼:Peter_Shih 发表于
import java.util.ArrayL
import java.util.I
public class Josephus {
public static void main(String[] args) {
ArrayList&Integer& mylist = new ArrayList&Integer&();
int num = 4;
int count = 0;
Iterator&Integer&
for (int i = 1; i &= 213; i++) {
mylist.add(i);
it = mylist.iterator();
while (mylist.size() &= 4) {
it = mylist.iterator();
while (it.hasNext()) {
it.next();
if (count % num == 0) {
it.remove();
for (int get : mylist) {
System.out.println(get);
开源从代码分享开始
琴麻岛的其他代码}

我要回帖

更多关于 约瑟夫环 c语言 数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信