应用-C/C++ 约瑟夫环问题

问题描述

C/C++ 约瑟夫环问题

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

 #include<stdio.h>
typedef struct
{
    int data[10];
    int front;
    int rear;
}CirQueue;
void InitQueue(CirQueue &Q)
{
    Q.front=Q.rear=0;
}
int InQueue(CirQueue &Q,int x)
{
    if((Q.rear+1)%10==Q.front) return 0;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%10;
    return 1;
}
int DelQueue(CirQueue &Q,int x)
{
    if(Q.front==Q.rear) return 0;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%10;
    return 1;
}
void Js(int n,int a)
{
    CirQueue S;
    int x=1,i=0;
    while((S.rear+1)!=S.front)
    {
        i++;
        if(i==a)
        {
            InQueue(S,x);
            i=0;
        }
        x++;
    }
    while(S.front!=S.rear)
    {
        DelQueue(S,x);
        printf("%d ",x);
    }
}
void main()
{
    Js(10,3);
}

没有语法报错,不能正常运行求看程序

解决方案

void Js(int n,int a)
{
CirQueue S;
int x=1,i=0;
while((S.rear+1)!=S.front)
{
i++;
if(i==a)
{
InQueue(S,x);
i=0;
}
x++;
}
while(S.front!=S.rear)
{
DelQueue(S,x);
printf("%d ",x);
}
}
你就没仔细看一下代码!
第一没初始化!
第二队列不是这样用的!
第三假设初始化了,也就是调用了InitQueue()函数,第一个循环什么时候会让S.rear成为-1然后 while ((S.rear + 1) != S.front)不成立结束循环?
第四假设你把 while ((S.rear + 1) != S.front)改成了 while (((S.rear + 1) % 10 )!= S.front),你这也不是解约瑟夫问题的算法吧!

解决方案二:

约瑟夫环问题是一道经典的数据结构的题目,问题描述为:编号为1,2,......,n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报到m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列,如此下去,直至圆桌周围的人全部出列为止。......
答案就在这里:约瑟夫环问题 (c / c++)

解决方案三:

http://m.blog.csdn.net/blog/m__dd/43673189

解决方案四:

这样写没有编程规范
int DelQueue(CirQueue &Q,int x)
{
if(Q.front==Q.rear) return 0;
x=Q.data[Q.front];
Q.front=(Q.front+1)%10;
return 1;
}
出队函数,传的是形参,Q.data[Q.front]没有传出去,

时间: 2024-09-09 13:57:34

应用-C/C++ 约瑟夫环问题的相关文章

约瑟夫环的问题

题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为1的小朋友开始报数.每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1...m报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到JOBDU名贵的"名侦探柯南"典藏版

常用算法:C#约瑟夫环问题

约瑟夫环问题,即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再出列,如此循环,直到所有人都出列为止.最后按出列顺序输出.代码如下: //从第start人开始计数,以alter为单位循环记数出列,总人数为total public int[] Jose(int total, int start,int alter) { int j, k = 0; //count数组存储按出列顺序的数据,以当结果返回 int[] count = new int[

python超简单解决约瑟夫环问题

  本文实例讲述了python超简单解决约瑟夫环问题的方法.分享给大家供大家参考.具体分析如下: 约瑟环问题大家都熟悉.题目是这样的.一共有三十个人,从1-30依次编号.每次隔9个人就踢出去一个人.求踢出的前十五个人的号码: 明显的约瑟夫环问题,python实现代码如下: ? 1 2 3 4 5 6 a = [ x for x in range(1,31) ] #生成编号 del_number = 8 #该删除的编号 for i in range(15): print a[del_number]

php解决约瑟夫环示例

 这篇文章主要介绍了php解决约瑟夫环示例,需要的朋友可以参考下 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".)   猴子一群,都带着号码的,站好了一圈,数到m的枪毙,剩下的接着数.如此往复,死剩下的一个就疯了    代码如下: <?php function killMonkeys($monkeys, $m){     $k = $m;     while (count($monkey

方法-循环列表求解约瑟夫环游戏用C++

问题描述 循环列表求解约瑟夫环游戏用C++ 简单的循环链表求解约瑟夫环游戏,传说有30个旅客同城做一条船,因为严重超载,加上风浪大作,危险万分.因此船长告诉大家,只有将乘客一半入海中,其他的人才能幸免遇难.无奈,大家只好同意这种方法,并议定30个人围成一圈,由第一个数起,依次报数,数到第九人,便把他扔入大海,然后再从他的下一个人数起,数到第九人,再将他扔入大海,如此循环地进行,直到剩下15个乘客为止.问那些位置将是被扔下大海.,将30个改为任意输入的正整数N,报数上限也改为一个任意的正整数k.

scheme解决约瑟夫环问题(续)

sicp的习题3.22,也就是以消息传递的风格重新实现队列,我的解答如下: (define (make-queue)   (let ((front-ptr '())        (rear-ptr '()))  (define (set-front-ptr! ptr) (set! front-ptr ptr))   (define (set-rear-ptr! ptr) (set! rear-ptr ptr))   (define (empty-queue?) (null? front-ptr

编程-约瑟夫环问题用java怎么解决,有简单点的方法吗

问题描述 约瑟夫环问题用java怎么解决,有简单点的方法吗 一组人(n)个,围成一圈,从某人开始数到滴三个的人出列,在接着从下一个人开始数,最终输出最终出列的人(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n)分别表示)围坐在一张圆桌周围.从编号k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,知道圆桌周围的人全都出列. 解决方案 import java.util.Scanner; public class count

数据结构 约瑟夫环-约瑟夫环的实验运行结果一直不对

问题描述 约瑟夫环的实验运行结果一直不对 在做约瑟夫环的实验,但是运行结果一直不对,偶尔会往前挪一个数或者往后挪,求帮忙修改,捉急呀~谢谢! #include #include #define Error -1 #define True 1 typedef struct LNode { int num;//定义人编号 int pwd;//密码 struct LNode *next; }LNode; LNode head,*p,*pt;//定义结点 int Createlinklist(int n

初学链表,解决约瑟夫环问题。

问题描述 初学链表,解决约瑟夫环问题. 在codebolcks里面运行能够正常出结果,但是不是return 0,return的数字和输入的n有关请问我的代码有问题吗? #include #include struct child { int num; struct child *pre; struct child *next; }; int main() { int n,k; scanf("%d %d",&n,&k); struct child *current,*pr