前言:
第一次碰到这个问题的时候,我还在学习C语言中的指针和链表。当初老师用了一个循环链表做出来了。思路很清晰,但是用链表还是比较复杂的。今天终于发现数组也可以解决。
思路:
使用一维数组记录13个小朋友的状态,同时初始化为1,1表示在圈里。使用一个变量k记录开始报数的位置,变量x记录此时正在报的数字。变量x等于要退出的数字时,将此时的小朋友的数组中的值改为0,表示已经退出。
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int[] a = new int[100];
int n = sc.nextInt(); //小朋友的个数
int k = sc.nextInt(); //从第几个小朋友开始报数
int m = sc.nextInt(); //报到第几个数字退出
int p = 0;
int x;
sc.close();
int i;
for(i = 1;i <= n;i++) {
a[i] = 1;
}
k--;
//核心部分
while(p < n - 1) {
x = 0; // x记录当前数的数,当小于要结束的m时,进行循环
while(x < m) {
k++; //记录在当前数到哪个同学上,相当于时数组的下标
if(k > n) {
k = 1; //如果数到n + 1,则回到第一个同学位置
}
//x的累加为,加上下一位同学的的底数。没有出局的同学底数为1,已经出局的同学底数为0。
x = x + a[k];
}
a[k] = 0;
p++;
}
for(i = 1;i <= n;i++) {
if(a[i] == 1) {
System.out.println(i);
}
}
}
}