2746:约瑟夫问题poj

2746:约瑟夫问题

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述
约瑟夫问题:有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<iostream>
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
using namespace std;

int main()
{
    int m,n;
    while(true)
    {
        int i,j;
        int count=0;
        cin>>m>>n;
        if(m==0&&n==0)//m,n同时为0的时候退出
            break;
        char *str;
        if((str=(char *)malloc((m+1)*sizeof(char)))==NULL)//判断是否能够分配空间
        {
            printf("failed!\n");
            exit(0);
        }
        memset(str,'1',(m+1)*sizeof(char));//分配空间,赋初值
        int last=m,ptr=0;//last为计数当前还有多少个没报数的猴子,ptr为移动指针,指向剩下的猴子
        while(last>1)
        {
            ptr++;
            if(str[ptr]=='1')//如果还没报数,则处理
            {
                count++;
                if(count==n)//计数到了出列的数字
                {
                    count=0;//重新计数
                    str[ptr]='0';//数组置零
                    last--;//猴子的数目减少
                }
            }
            if(ptr==m)//指针移动到了最后一个猴子
            {
                ptr=0;
            }
        }
        for(int k=1;k<=m;k++)
        {
            if(str[k]=='1')
            {
                cout<<k<<endl;
                break;
            }
        }
        free(str);
        str=NULL;
    }
    return 0;
}

 

#include<iostream>
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
using namespace std;
int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        if(m==0&&n==0)
        {
            break;
        }
        char *str;
        int last,ptr,count;
        if ((str=(char *) calloc (m + 1, sizeof(char))) == NULL) //这里判断需小心,是数组的长度
        {
            printf("空间分配失败!\n");
            exit(-1);
        }
        memset(str,'1',(m+1)*sizeof(char));
        count=ptr=0;
        last=m;
        while(last>1)
        {
            ptr++;
            if(str[ptr]=='1')
            {
                count++;
                
                if(count==n)
                {
                    count=0;
                    str[ptr]='0';
                    last--;
                }
            }
            if(ptr==m)
            {
                ptr=0;
            }
        }
        for(ptr=1;ptr<=m;ptr++)
        {
            if(str[ptr]=='1')
            {
                cout<<ptr<<endl;
                break;
            }
        }
        free(str);
        str=NULL;
    }
    return 0;
}
View Code
#include<iostream>
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
using namespace std;
int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        if(m==0&&n==0)
        {
            break;
        }
        /*
        char *str;
        int last,ptr,count;
        if ((str=(char *) calloc (m + 1, sizeof(char))) == NULL) //这里判断需小心,是数组的长度
        {
            printf("空间分配失败!\n");
            exit(-1);
        }
        memset(str,'1',(m+1)*sizeof(char));
        count=ptr=0;
        last=m;
        while(last>1)
        {
            ptr++;
            if(str[ptr]=='1')
            {
                count++;
                
                if(count==n)
                {
                    count=0;
                    str[ptr]='0';
                    last--;
                }
            }
            if(ptr==m)
            {
                ptr=0;
            }
        }
        for(ptr=1;ptr<=m;ptr++)
        {
            if(str[ptr]=='1')
            {
                cout<<ptr<<endl;
                break;
            }
        }
        free(str);
        str=NULL;*/
        int s=0;
        for(int  i=1;i<=m;i++)
        {

            s=(s+n)%i;
        }
        cout<<s+1<<endl;
    }
    return 0;
}
View Code

 

posted @ 2017-08-11 16:00  A-inspire  Views(210)  Comments(0Edit  收藏  举报