JAVA围圈报数 问题

Python020

JAVA围圈报数 问题,第1张

以下是完整示例代码,countThree(50, 0, 3)的意思是50个人,从第1个位置起,每3个出一个。第二个参数就是你的问题的解答。

import java.util.*

import java.lang.*

import java.io.*

/* Name of the class has to be "Main" only if the class is public. */

class Ideone

{

public static void main (String[] args) throws java.lang.Exception

{

// your code goes here

countThree(50, 0, 3)

}

/**

* @param n人的总数

* @param start开始报数的序号,start <n

* @param m 出列的标记(可以大于n)

*/

private static void countThree(int n, int start, int m) {

List<Integer>list = new ArrayList<Integer>()

//初始化列表

for (int i = 1i <= ni++) {

list.add(i)

}

while (list.size() >0) {

//将前连个移入列表尾端

for (int j = 0j <m-1j++) {

list.add(list.remove(start))

}

//打印出列的序号

System.out.println(list.remove(start))

}

}

}

public class Increase {

public static void rep(boolean[] people) {

int i = 0,j=0,n=people.length,m=n

while(n>2){

i=++i%m

if (people[i] == true){

j++

if (j==3){

people[i] = false

System.out.println(i)

n--//总人数减1

j = 0//到3从头数

}

}

}

}

public static void main(String[] args) {

boolean people[] = new boolean[10]

for(int i = 0 i<10 i++){

people[i] = true

}

rep(people)

}

}

main函数为测试例子,打印结果如下

3

6

9

2

7

1

8

5

这个问题是很经典的编程问题,叫约瑟夫环问题,我之前有写程序,所以直接拷给你吧,我初始的n值为13,你也可以自己修改

//YueSeFu.java

public class YueSeFu {

public static void main(String[] args)

{

final int n=13,s=1,m=5//n为总人数,从第1个人开始报数,报数到m的出圈

int[] p=new int[n]//数组p用于标记已出圈的人

int[] q=new int[n]//数组q存放出队的顺序

int i,j,k,N=0

k=s-2//k从1开始数出圈人的下标

for(i=1i<=ni++)

{

for(j=1j<=mj++)//从1到m报数,计算出圈人的下标k

{

if(k==n-1)//当出圈人的下标达到末尾时

{

k=0//出圈人的下标从0开始

}

else

k++//否则下标+1

if(p[k]==1)//若平p[k]=1,说明下标为k的人已出圈

{

j--//由于让过已出圈的人,所以j要-1,以保证每次数过m个人

}

}

p[k]=1//将下标为k的数组元素置1,表示出圈

q[N++]=k+1//将下标为k的人的编号k+1,存入数组元素q[N]中

}

System.out.println("出圈顺序为:")

for(i=0i<ni++)

{

System.out.print(q[i]+" ")

}

}

}