BBBBB

约瑟夫问题


  

问题描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号

开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,

直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编

号。

输入数据

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行

是:

0 0

输出要求

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

输入样例:

6 2

12 4

8 3

0 0

输出样例:

5

1

7

数组实现:

#include <stdio.h>

void main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int a[1000];
    for(int i=0;i<m;i++)
    {
        a[i]=1;
    }
    int index=0;//猴子索引
    int loc;//记录位置
    int t=0;
    int p=m;//还剩猴子数
    while(p>0)
    {
        if(a[index]==1)
        {    
            ++t;
            if(t%n==0)
            {
                a[index]=0;
                loc=index;
                p--;
            }

        }
        if(index < m-1)
            index++;
        else
            index=0;
    }
    printf("%d\n",loc);
}

  链表实现:

#include <stdio.h>

struct Monkey
{
	int i;
	Monkey * next;
};

int main()
{
	int n,t;
	scanf("%d%d",&n,&t);
	Monkey * head,* curr;
	curr=NULL;
	head=NULL;
	Monkey *m=new Monkey;
	m->i=0;
	head=m;
	curr=m;
	for(int i=1;i<n;i++)
	{
		Monkey *m=new Monkey;
		m->i=i;
		curr->next=m;
		curr=m;
	}
	curr->next=head;
	int p=1;
	while(curr->next!=NULL)
	{
		if(curr->next->next==curr->next)
		{
			printf("%d\n",curr->next->i+1);
			break;
		}
		if(p==t)
		{
			Monkey *t=curr->next;
			curr->next=curr->next->next;
			delete t;
			p=1;
		}
		p++;
		curr=curr->next;
	}
	return 0;
}

  

posted @ 2011-09-03 15:45  如是然  阅读(2521)  评论(0)    收藏  举报