0
点赞
收藏
分享

微信扫一扫

SWUST OJ 956 约瑟夫问题的实现

晗韩不普通 2022-04-14 阅读 74

n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。

#include<bits/stdc++.h>
#include <iostream>
#include<algorithm>

using namespace std;

int main()
{
    int n,k;
    cin>>n>>k;
    //建立一个数组来记录人,当数组对应下标的值为0时表示该人已经阵亡
    int a[n+1];
    for(int i=0;i<=n;i++)
    {
        a[i]=i;
    }
    //用sum统计当前存活的人的总数
    int sum=n;
    //suml记录报数
    int suml=1;
    while(sum!=1)
    {
        for(int i=1;i<=n;i++)
        {
            //当该人存活且报数的值为k的倍数时则应死亡
            if(a[i]!=0&&suml%k==0)
            {
                a[i]=0;
                sum--;
                suml++;
            }
            else if(a[i]!=0)
            {
                suml++;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=0)
        {
            cout<<i<<endl;
        }
    }
    return 0;
}
举报

相关推荐

0 条评论