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]+" ")
}
}
}