题解 | #ZQ的睡前故事#
ZQ的睡前故事
https://ac.nowcoder.com/acm/problem/15896
考察重点:约瑟夫环
首先根据题意,从1开始顺时针数,数到k个就停下并输出当前对应数字,很明显,重点是在循环中找到所需的数字,且不能重复选择已选择过的数字(不可以花心哦  ̄へ ̄)
以 n=10,k=3 为例,前面输出 3,6,9不作多过赘述,按照题意,从9重新开始循环至2(10->1->2),那么,接下来从2开始,应该是5才对;但为什么接下来是7呢?很简单,因为你之前已经输出过3和6了(意味着你已经给三女友和六女友打过电话了,没必要再打一遍,搞区别对待小心被甩(bushi)),所以之后正确的输出应该是:2->3(pass)->4->5->6(pass)->7,所以下一个要打给7,以此类推
理清思路后就简单了,附上ac代码(∠ • ω <)~☆
#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
for (int i = 0; i<t; i++) {
int n, k;
scanf("%d %d", &n, &k);
int arr[n];
for (int j = 0; j < n; j++) {
arr[j] = 0;
}//初始化列表
int start = 0;
for (int j = 0; j < n; j++) {
int count = 0;
while (count < k) {
start = (start + 1) % n;
if (arr[start] != 1) {
count++;//已经排除的不会算在循环里
}
}
if (start == 0) {
printf("%d ", n);//如果正好可以被整除,说明此时就是n
}
else {
printf("%d ", start);//反之则是对应数字
}
arr[start] = 1;//别忘了排除已选过的数字
}
printf("\n");
}
return 0;
}
就到这了,希望对你有所帮助,bye~