用数组解决约瑟夫环问题
设计思路:建立整形数组,长度和人数相等,给所有数组元素赋值1,从头开始计数,循环m次后将计数结果输出,并将该位置的元素赋值0,对循环变量进行加一取模运算,使其在数组间循环n次,每次都输出计数为m时的数组下标,得出输出序列.
代码实现:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] a = new int[200];
int n = in.nextInt();
int m = in.nextInt();
for (int i = 0; i < n; i++) {
a[i] = 1; //所有元素用1填充,以便计数
}
int count = 1;
int j = 0;
for (int i = 0; i < n; i++) {
while (count < m) { //计数count=m时得出位置元素j,
j = (j + 1) % n;
count += a[j];
}
a[j] = 0; //删除该元素,即令a[j]=0 count循环时若遇到已被删除的元素a[j],则count+0,等同于跳过该元素
count = 0;
System.out.print((j + 1) + " ");
}
}
样例输入输出:
5 7
2 5 1 3 4
8 4
4 8 5 2 1 3 7 6
5 7
2 5 1 3 4