sinat_31829943 2015-10-26 09:25 采纳率: 60%
浏览 3628
已采纳

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);
}

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

  • 写回答

4条回答

  • qilimi-1 2015-10-27 10:44
    关注

    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),你这也不是解约瑟夫问题的算法吧!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多