约瑟夫环-源码
#include <iostream>
using namespace std;
typedef struct Node
{
int num,pwd;//num为人员编号,pwd为人眼所处位置的值
struct Node *next;
}LNode, *LinkList;
void main()
{
int i=1,m,n,j;//m为报数上限值,n为人数,j为输入的密码;
cout<<"please enter m:";
cin>>m;
cout<<"please enter n:";
cin>>n;
LinkList head,p,pt;
while(i<=n)
{
pt=new Node;
if(i==1)
{
p=head=pt;
cout<<"please enter the value:";
cin>>j;
p->num=i;
p->pwd=j;
i++;
}
else
{
p->next=pt;
p=pt;
cout<<"please enter the value:";
cin>>j;
p->num=i;
p->pwd=j;
i++;
}
}
p->next=head;
for(i=1;i<=n;i++)
{
LinkList pd = new Node;
for(int a=1;a<m;a++)
p=p->next;
pd=p->next;
m=pd->pwd;
cout<<m<<"\t"<<pd->num<<endl;
p->next=pd->next;
free(pd);
}
cout<<'\n';
}
这是一种方法,此种方法比较传统,不过比较全面,既可以输出序列,也可以输出序列所对应的值(当值和编号不同时尤其重要);另外有一种比较灵巧的算法,如下:
#include <stdio.h> int main() { int n, m, s = 0; printf ("N M = "); scanf("%d%d", &n, &m); for (int i = 2; i <= n; i++) { s = (s + m) % i; } printf ("\nThe winner is %d\n", s+1); } n个人,数到m跳出,从第一个人开始数;求最后的胜出者;
具体作者不明,可以参考:http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html
浙公网安备 33010602011771号