读书人

绕圈的有关问题

发布时间: 2012-02-21 16:26:23 作者: rapoo

绕圈的问题
n个人围成一个圈,每隔m个就出局一个,问最后剩下的是那个/些。
请高人指点 最好有example code~
谢谢

[解决办法]
此题可以用三种方法实现
1. 循环链表
2. 队列
3. 纯数学法

推荐用第二种,好理解,易实现。
[解决办法]
如果是要求所有人出列的顺序,可以用这个:
//////////////////////////////////////////////////////
约瑟夫问题的数学解法:(n个人报数,从1开始,报到m出列)
e(i)=f(i)+1
其中:
f(1)=(m-1)%n
f(2)=((m-1)%(n-1)+m)%n
f(3)=(((m-1)%(n-2)+m)%(n-1)+m)%n
f(i)=g(i)
其中:
i=2时:
g(1)=(m-1)%(n-i+1);
g(2)=(g(1)+m)%(n-i+2);
f(2)=g(2);
i=3时:
g(1)=(m-1)%(n-i+1);
g(2)=(g(1)+m)%(n-i+2);
g(3)=(g(2)+m)%(n-i+3);


*******************************************************
i=t时:
g(1)=(m-1)%(n-i+1);
g(t)=((g(t-1)+m)%(n-i+t))%(n-i+t)
=(g(t-1)+m)%(n-i+t);
注:对于函数g(t)来讲,t为变量,i和f(i-1)均为常量。
*******************************************************



C++实现如下:

C/C++ code
//实现n个人报数,从k开始,报到m的出列的C++程序如下:#include <iostream>using namespace std;int main(){    int m,n,k;    cin>>k>>m>>n;    int f=(m-1)%n;    cout<<(f+k-1)%n+1<<" ";    for(int i=2;i<=n;i++)    {        int g=(m-1)%(n-i+1);        for(int j=2;j<=i;j++)        {            g=(g+m)%(n-i+j);        }        f=g;        cout<<(f+k-1)%n+1<<" ";    }    cout<<endl;    return 0;}
[解决办法]
public begin(int m ,int n)/*m为人数数到n*/循环链表链表自己整
{
int j=20,b=1;
Linklist l=new childshushu().creat();
while(m>0)
{
if((l.getNext()==null)&&m==1){System.out.print(l.getData());break;}
l=l.getNext();++b;//}
if((b%n)==0)
{
System.out.print(" "+(l.getNext()).getData());
b=0;
--m;l.setNext(l.getNext().getNext());}
}
}

读书人网 >软件架构设计

热点推荐