在一行中输入三个整数
,用空格隔开。
输出一个整数,表示最后剩下的"大王"编号。
5 1 2
3
初始队列编号为,从编号
开始报数:
出队,剩余
;
出队,剩余
;
出队,剩余
;
出队,剩余
,输出
。
#include <stdio.h>
int main() {
int n, k, m;
if (scanf("%d %d %d", &n, &k, &m) != 3 || n < 2 || n > 100 || k < 0 || k >= n || m < 1 || m > 100) {
return 1;
}
int N[n], t = m - 1;
for (int i = 0; i < n; i += 1) {
N[i] = i;
}
while (n > 1) {
k = (k + t) % n;
n -= 1;
for (int i = k; i < n; i += 1) {
N[i] = N[i + 1];
}
}
printf("%d", *N);
return 0;
} #include <stdio.h>
#define MAX 105
int main() {
int n=0,k=0,m=0;
int arr[MAX]={0};
scanf("%d%d%d",&n,&k,&m);
if(n>=2&&n<=100&&k>=0&&k<=n-1&&m>=1&&m<=100)
{
int count=n;//剩余人数
int cur=k;
for(int i=0;i<n;i++)
{
arr[i]=i;
}
while(count>1)
{
int step=0;//当前步数
while(step<m)
{
if(arr[cur]!=-1)//出队的人的下标标为-1
{
step++;
}
if(step<m)
{
cur=(cur+1)%n;
}
}
//报数到m了出队
arr[cur]=-1;
count--;
while(arr[cur]==-1)
{
cur=(cur+1)%n;//重新报数位置
}
}
for(int i=0;i<n;i++)
{
if(arr[i]!=-1)//最终数组里面只剩一个不为-1的元素就是大王了
{
printf("%d",arr[i]);
break;
}
}
}
return 0;
} #include <stdio.h>
int main()
{
int n, k, m;
scanf("%d %d %d", &n, &k, &m);
int arr[n],a=0,p=k;//arr[]s数组标记0出队,a标记出队人数,p标记当前未出队的首个报数编号
for(int i=0;i<n;i++) arr[i] = 1;
while(n-1-a)
{
for(int j=0;j<m-1;j++)
{
do{
if(++p==n) p=0;
}while(!arr[p]);//找出出队编号
}
arr[p]=0;
a++;
do{
if(++p==n) p=0;
}while(!arr[p]);//找出出队后下个首个报数编号
}
printf("%d\n",p);
return 0;
}