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;
}