问题描述:有n个人围成一圈,从第1个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,依次类推,直到所有人都出圈,请依次输出出圈人的编号。
输入格式:
输入两个整数 n和m,1m,n100。
输出格式:
输出一行n个整数,按顺序输出每个出圈人的编号。
输入样例:10 3
输出样例:3 6 9 2 7 1 8 5 10 4
这题最简单的方法就是定义一个一维数组,数组[i]的i就是节点的值,而数组[i]的值是下一个节点。
#include<bits/stdc++.h>
int nodes[150];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n-1;i++) nodes[i] = i+1; //nodes[i]的值就是下一个节点
nodes[n] = 1; //循环链表:尾指向头
int now = 1,prev = 1; //从第一个节点开始
while((n--)>1){
for(int j=1;j<m;j++){ //数到m,停下
prev = now; //下一个节点
now = nodes[now];
}
printf("%d ",now);
nodes[prev] = nodes[now]; //跳过now节点,即删除now
now = nodes[prev]; //新的now节点
}
printf("%d ",now);
return 0;
}
标签:输出,出圈,10,int,样例,约瑟夫,问题,数组
From: https://blog.csdn.net/2301_80225641/article/details/142215139