快乐地玩耍
描述
有n个小伙伴(按顺时针将他们编号为0~n-1)坐在一起,围成一个圈快乐地玩耍。现在他们在玩一个游戏,从第0号小伙伴开始报数(报数从1开始),接下来顺时针下一位小伙伴报2,依次类推,一旦有谁报的号码是K的倍数,那么他就要退出这个圈,留下其他人继续玩。最终全部人都会都退出来,现在要求的是全部人出圈的顺序。
比如n=5,k=3。那么出圈的顺序就是 2 0 4 1 3.数字表示小伙伴们的编号。
输入
输入文件的第一行为一个整数T,表示总共有T组数据。
接下来有T行,每行有两个整数n,k。1<=n,k<=100。
输出
对于每组数据,输出一行n个整数,每两个整数间用空格隔开,表示出圈顺序。
输入样例 1
2
5 3
3 5
输出样例 1
2 0 4 1 3
1 2 0
Solution
模拟环形数组
Code
int T,n,k;
int c[105];
bool st[105];
int main(){
cin >> T;
while(T --){
int cnt1 = 0, cnt2 = 0; //初始化
memset(st,0,sizeof st);
cin >> n >> k;
for(int i = 0; cnt2 < n ; i ++){
if(i == n)i = 0; //如果越过终点,回到起点
if(!st[i]){ //如果没有出圈
cnt1 ++; //记录次数
}
if(cnt1 == k){ //如果是k的倍数
cnt1 = 0; //记录归0
st[i] = 1; //出圈
cnt2 ++; //出圈人数加一
cout << i; //输出当前出圈人的序号
if(cnt2 != n)cout << " ";
else cout << endl; //最后一个人换行
}
}
}
return 0;
}