问题描述
- 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]没有传出去,