约瑟夫问题

Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下: 

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。 
Input
输入n和m值。 
Output
输出胜利者的编号。 
Example Input
5 3
Example Output
4
Hint
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀 


#include <iostream>

using namespace std;

int main()
{
    int n,m,i,j,cont;
    int people[1000];
    cin>>n>>m;
    cont=n;
    for(i=1;i<=n;i++)
        people[i]=i;
    for(i=1,j=0;i<=n;i++)
    {
        if(people[i]!=0)
        {
            j++;
            if(j%m==0)
            {
                people[i]=0;
                cont--;
            }
        }
        if(i==n)
            i=0;
        if(cont==1)
            break;
    }
    for(i=1;i<=n;i++)
    {
        if(people[i]!=0)
            cout<<i<<endl;
    }
    
    return 0;
}




链表写法
#include<stdio.h>  
#include<stdlib.h>  
struct node   
{  
    int data;  
    struct node *next;  
};  
int main(void)  
{  
    int i,m,n;  
    struct node *head,*tail,*p,*s,*t;  
    scanf("%d%d",&n,&m);  
    head=NULL;  
    tail=head;  
    for(i=1;i<=n;i++)  
    {  
        p=(struct node *)malloc(sizeof(struct node));  
        p->data=i;  
        if(head==NULL) head=p;  
        else tail->next=p;  
        tail=p;  
    }  
    tail->next=head;  
    t=head;  
    while(t!=t->next)   
    {  
        for(i=1;i<m;i++)  
        {  
            s=t;  
            t=t->next;  
        }  
        s->next=t->next;  
        free(t);  
        t=s->next;  
    }  
    printf("%d
",t->data);  
    return 0;  
}  
原文地址:https://www.cnblogs.com/xiao-xue-di/p/9454782.html