一个循环,大侠们进来帮帮忙!

时间:2022-09-05 21:30:57
有100个人围成一个圈(编号0-99),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩一个人为止,问此人原来的位置是多少号?(最好在有些重要的语句的时候附上点注释,谢啦!)

38 个解决方案

#1


问题是不是报数的人只1,2,3的报数???

#2


不是。。。就是一般的数数,从1开始数,然后数到3的倍数的人就离开圈子。。。 所以首先都不知道一共要循环一次,就是假如说数完第一圈  从1 开始的  100个人过后   再转到第一个人的时候就数101,以此类推,只要是3倍数的人就出去,直到最后剩下一个!

#3


约瑟夫环问题

#4


引用 3 楼 java1109 的回复:
约瑟夫环问题

不懂。。。我才初学JAVA不久。

#5


引用 3 楼 java1109 的回复:
约瑟夫环问题

百度一下这个问题就OK了

#6


引用 1 楼 xin625201 的回复:
问题是不是报数的人只1,2,3的报数???

不过你这样想也可以的,就是100个人都喊1,2,3 喊到3的人就出去 , 问题就在于第二圈和后面的时候原来喊的人数字会有变化 比方说第一圈的时候 喊99的人喊3  那么第100个人的时候就喊1 原来第一圈喊1的人就喊2 了。。就是这个让我头疼!

#7


引用 6 楼 souldeviler 的回复:
引用 1 楼 xin625201 的回复:
问题是不是报数的人只1,2,3的报数???

不过你这样想也可以的,就是100个人都喊1,2,3 喊到3的人就出去 , 问题就在于第二圈和后面的时候原来喊的人数字会有变化 比方说第一圈的时候 喊99的人喊3 那么第100个人的时候就喊1 原来第一圈喊1的人就喊2 了。。就是这个让我头疼!

兄弟,强哦,压秒提交。。

#8



public static int lastValue(List list, int n){
while(true){
if(list.size() == 1)
break;
for(int i=0;i<n-1;i++){
list.add(list.remove(0));
}
list.remove(0);
}
return (Integer)list.get(0);
}

冒失这个题目我以前笔试过

#9


你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

#10


方法很多 可以用基本的数组解决 就是麻烦点 ,也可以用集合框架中的类来解决

#11


引用 9 楼 yudun1989 的回复:
你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

2虽然不是3的倍数,但是3就是3的倍数了撒。。假如剩下2个人,第一个人喊1 ,第二个人喊2,那么第一个人就喊3撒,。他就出去了。。还是剩下一个!

#12


引用 11 楼 souldeviler 的回复:
引用 9 楼 yudun1989 的回复:
你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

2虽然不是3的倍数,但是3就是3的倍数了撒。。假如剩下2个人,第一个人喊1 ,第二个人喊2,那么第一个人就喊……

额。昏了昏了。恩。这样就明白了。弄两个循环,一个重复遍历100的数组,一个就从1-3数。就可以了。

#13


我帮你到网上找了一段代码,正好自己也可以研究一下这个定律,感觉这段代码还算不错,大家一起学习学习!

import java.util.Scanner;

public class Test {
    public static void main(String[] args){
     System.out.println("程序说明如下:");
     System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数," +
     "直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");         
     // 提示输入总人数
     System.out.println("请输入做这个游戏的总人数:");
     Scanner sca=new Scanner(System.in);
     int m=sca.nextInt();
     // 提示输入要出圈的数值
     System.out.println("请输入要出圈的数值:");        
        int n=sca.nextInt();
        System.out.println("按出圈的次序输出序号:");        
        // 创建有m个值的数组
        int[] a=new int[m];
        // 初始长度,以后出圈一个,长度就减一
        int len=m;
        // 给数组赋值
        for(int i=0;i<a.length;i++)
         a[i]=i+1;
        // i为元素下表,j代表当前要报的数
        int i=0;
        int j=1;
        while(len>0){
         if(a[i%m]>0){
         if(j%n==0){// 找到要出圈的人,并把圈中人数减一
         System.out.print(a[i%m]+"  ");
         a[i%m]=-1;
              j=1;
                i++;
                len--;
             }else{
                i++;
                j++;
             }
         }else{// 遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
            i++;
         }
    }
}

#14


这个我好好研究下!主要初学JAVA不久。。。这个循环貌似听过,但是就是自己没有遇到过,现在遇到了 感觉好难

#15


#16


import java.util.Vector;

public class Loop {

public static void main(String[] args) {
Vector<Integer> man = new Vector<Integer>(0);
for (int i=0;i<100;i++) {
man.add(i);
}
int i = 0;//用以数数
int num = 0;//用以控制数到头以后的序号翻转
while (man.size() > 1) {
i++;
if (i%3 == 0) {
System.out.println("移除:" + man.get(num));
man.remove(num);//3的倍数时移除该元素
num--;//移除之后的序号偏移
}
num++;
if (num >= man.size()) {
num -= man.size();
}
}
System.out.println("剩下:" + man.get(0));
}
}

#17




public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + step) % i;
return r;
}


这么长代码就够了

#18


学习中呢。谢谢啊。

#19




//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + step) % i;
return r;
}

#20


很好很强大..  正好研究下

#21


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r……

这个貌似有问题啊。。假如说是9个人一个桌子,最后出去的应该是8号。但是 用这个方法算的最后出去的是1号

#22


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r……

。。。。算错了  不好意思!

#23


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r = (r + step) % i;
        return r;


这个r一开始赋值为0,是不是说是从0号人开始?i 一开始赋值为2 是为什么啊?

#24


引用 8 楼 niemengwem 的回复:
Java code

public static int lastValue(List list, int n){
        while(true){
            if(list.size() == 1)
                break;
            for(int i=0;i<n-1;i++){
                list.a……


这是什么算法?

#25


该回复于2010-12-02 16:07:23被版主删除

#26


class Kid {
int num;

Kid left;
Kid right;
}

class Circle {
Kid kid[] = new Kid[100];
public void inCricle() {
for(int i=0;i<kid.length;i++) {
kid[i]=new Kid();
kid[i].num = i;
}
for(int i=1;i<kid.length-1;i++) {
kid[i].left=kid[i-1];
kid[i].right=kid[i+1];
}
kid[0].left=kid[kid.length-1];
kid[0].right=kid[1];
kid[99].left=kid[98];
kid[kid.length-1].right=kid[0];
}
public int getIndex() {
int count = 0 ;
while(true) {
for(int i=0;i<kid.length;i++) {
if(kid[i].left!=null&&kid[i].right!=null) {
count++;
}
if(count==3) {
kid[i].left.right=kid[i].right;
kid[i].right.left=kid[i].left;
kid[i].left=null;
kid[i].right=null;

count=0;
}
if((kid[i].left==kid[i])&&(kid[i].right==kid[i])) {
return kid[i].num;
}
}
}
}
public static void main(String []args) {
Circle c = new Circle();
c.inCricle();
System.out.println(c.getIndex());
}

}

#27


引用 13 楼 xin625201 的回复:
我帮你到网上找了一段代码,正好自己也可以研究一下这个定律,感觉这段代码还算不错,大家一起学习学习!

import java.util.Scanner;

public class Test {
  public static void main(String[] args){
  System.out.println("程序说明如下:");
  System.out.println……

#28


import java.util.ArrayList;

public class Test {

public static void main(String[] args) throws Exception{

ArrayList<String> array=new ArrayList<String>();
for(int i=0;i<100;i++)
array.add(i+"");

int num=1,i=0;
while(true){
if(array.size()==1)
break;
num++;
i++;
System.out.println("I-->"+i+"array.size()-->"+array.size());
if(i==array.size())
i=0;
if(num==3){
System.out.println(array.remove(i));

i--;
num=0;
}
}
System.out.println(array.get(0));
}
}

打印结果:
I-->1array.size()-->100
I-->2array.size()-->100
2
I-->2array.size()-->99
I-->3array.size()-->99
I-->4array.size()-->99
5
I-->4array.size()-->98
I-->5array.size()-->98
I-->6array.size()-->98
8
I-->6array.size()-->97
I-->7array.size()-->97
I-->8array.size()-->97
11
I-->8array.size()-->96
I-->9array.size()-->96
I-->10array.size()-->96
14
I-->10array.size()-->95
I-->11array.size()-->95
I-->12array.size()-->95
17
I-->12array.size()-->94
I-->13array.size()-->94
I-->14array.size()-->94
20
I-->14array.size()-->93
I-->15array.size()-->93
I-->16array.size()-->93
23
I-->16array.size()-->92
I-->17array.size()-->92
I-->18array.size()-->92
26
I-->18array.size()-->91
I-->19array.size()-->91
I-->20array.size()-->91
29
I-->20array.size()-->90
I-->21array.size()-->90
I-->22array.size()-->90
32
I-->22array.size()-->89
I-->23array.size()-->89
I-->24array.size()-->89
35
I-->24array.size()-->88
I-->25array.size()-->88
I-->26array.size()-->88
38
I-->26array.size()-->87
I-->27array.size()-->87
I-->28array.size()-->87
41
I-->28array.size()-->86
I-->29array.size()-->86
I-->30array.size()-->86
44
I-->30array.size()-->85
I-->31array.size()-->85
I-->32array.size()-->85
47
I-->32array.size()-->84
I-->33array.size()-->84
I-->34array.size()-->84
50
I-->34array.size()-->83
I-->35array.size()-->83
I-->36array.size()-->83
53
I-->36array.size()-->82
I-->37array.size()-->82
I-->38array.size()-->82
56
I-->38array.size()-->81
I-->39array.size()-->81
I-->40array.size()-->81
59
I-->40array.size()-->80
I-->41array.size()-->80
I-->42array.size()-->80
62
I-->42array.size()-->79
I-->43array.size()-->79
I-->44array.size()-->79
65
I-->44array.size()-->78
I-->45array.size()-->78
I-->46array.size()-->78
68
I-->46array.size()-->77
I-->47array.size()-->77
I-->48array.size()-->77
71
I-->48array.size()-->76
I-->49array.size()-->76
I-->50array.size()-->76
74
I-->50array.size()-->75
I-->51array.size()-->75
I-->52array.size()-->75
77
I-->52array.size()-->74
I-->53array.size()-->74
I-->54array.size()-->74
80
I-->54array.size()-->73
I-->55array.size()-->73
I-->56array.size()-->73
83
I-->56array.size()-->72
I-->57array.size()-->72
I-->58array.size()-->72
86
I-->58array.size()-->71
I-->59array.size()-->71
I-->60array.size()-->71
89
I-->60array.size()-->70
I-->61array.size()-->70
I-->62array.size()-->70
92
I-->62array.size()-->69
I-->63array.size()-->69
I-->64array.size()-->69
95
I-->64array.size()-->68
I-->65array.size()-->68
I-->66array.size()-->68
98
I-->66array.size()-->67
I-->67array.size()-->67
I-->1array.size()-->67
1
I-->1array.size()-->66
I-->2array.size()-->66
I-->3array.size()-->66
6
I-->3array.size()-->65
I-->4array.size()-->65
I-->5array.size()-->65
10
I-->5array.size()-->64
I-->6array.size()-->64
I-->7array.size()-->64
15
I-->7array.size()-->63
I-->8array.size()-->63
I-->9array.size()-->63
19
I-->9array.size()-->62
I-->10array.size()-->62
I-->11array.size()-->62
24
I-->11array.size()-->61
I-->12array.size()-->61
I-->13array.size()-->61
28
I-->13array.size()-->60
I-->14array.size()-->60
I-->15array.size()-->60
33
I-->15array.size()-->59
I-->16array.size()-->59
I-->17array.size()-->59
37
I-->17array.size()-->58
I-->18array.size()-->58
I-->19array.size()-->58
42
I-->19array.size()-->57
I-->20array.size()-->57
I-->21array.size()-->57
46
I-->21array.size()-->56
I-->22array.size()-->56
I-->23array.size()-->56
51
I-->23array.size()-->55
I-->24array.size()-->55
I-->25array.size()-->55
55
I-->25array.size()-->54
I-->26array.size()-->54
I-->27array.size()-->54
60
I-->27array.size()-->53
I-->28array.size()-->53
I-->29array.size()-->53
64
I-->29array.size()-->52
I-->30array.size()-->52
I-->31array.size()-->52
69
I-->31array.size()-->51
I-->32array.size()-->51
I-->33array.size()-->51
73
I-->33array.size()-->50
I-->34array.size()-->50
I-->35array.size()-->50
78
I-->35array.size()-->49
I-->36array.size()-->49
I-->37array.size()-->49
82
I-->37array.size()-->48
I-->38array.size()-->48
I-->39array.size()-->48
87
I-->39array.size()-->47
I-->40array.size()-->47
I-->41array.size()-->47
91
I-->41array.size()-->46
I-->42array.size()-->46
I-->43array.size()-->46
96
I-->43array.size()-->45
I-->44array.size()-->45
I-->45array.size()-->45
0
I-->0array.size()-->44
I-->1array.size()-->44
I-->2array.size()-->44
7
I-->2array.size()-->43
I-->3array.size()-->43
I-->4array.size()-->43
13
I-->4array.size()-->42
I-->5array.size()-->42
I-->6array.size()-->42
21
I-->6array.size()-->41
I-->7array.size()-->41
I-->8array.size()-->41
27
I-->8array.size()-->40
I-->9array.size()-->40
I-->10array.size()-->40
34
I-->10array.size()-->39
I-->11array.size()-->39
I-->12array.size()-->39
40
I-->12array.size()-->38
I-->13array.size()-->38
I-->14array.size()-->38
48
I-->14array.size()-->37
I-->15array.size()-->37
I-->16array.size()-->37
54
I-->16array.size()-->36
I-->17array.size()-->36
I-->18array.size()-->36
61
I-->18array.size()-->35
I-->19array.size()-->35
I-->20array.size()-->35
67
I-->20array.size()-->34
I-->21array.size()-->34
I-->22array.size()-->34
75
I-->22array.size()-->33
I-->23array.size()-->33
I-->24array.size()-->33
81
I-->24array.size()-->32
I-->25array.size()-->32
I-->26array.size()-->32
88
I-->26array.size()-->31
I-->27array.size()-->31
I-->28array.size()-->31
94
I-->28array.size()-->30
I-->29array.size()-->30
I-->30array.size()-->30
3
I-->0array.size()-->29
I-->1array.size()-->29
I-->2array.size()-->29
12
I-->2array.size()-->28
I-->3array.size()-->28
I-->4array.size()-->28
22
I-->4array.size()-->27
I-->5array.size()-->27
I-->6array.size()-->27
31
I-->6array.size()-->26
I-->7array.size()-->26
I-->8array.size()-->26
43
I-->8array.size()-->25
I-->9array.size()-->25
I-->10array.size()-->25
52
I-->10array.size()-->24
I-->11array.size()-->24
I-->12array.size()-->24
63
I-->12array.size()-->23
I-->13array.size()-->23
I-->14array.size()-->23
72
I-->14array.size()-->22
I-->15array.size()-->22
I-->16array.size()-->22
84
I-->16array.size()-->21
I-->17array.size()-->21
I-->18array.size()-->21
93
I-->18array.size()-->20
I-->19array.size()-->20
I-->20array.size()-->20
4
I-->0array.size()-->19
I-->1array.size()-->19
I-->2array.size()-->19
18
I-->2array.size()-->18
I-->3array.size()-->18
I-->4array.size()-->18
36
I-->4array.size()-->17
I-->5array.size()-->17
I-->6array.size()-->17
49
I-->6array.size()-->16
I-->7array.size()-->16
I-->8array.size()-->16
66
I-->8array.size()-->15
I-->9array.size()-->15
I-->10array.size()-->15
79
I-->10array.size()-->14
I-->11array.size()-->14
I-->12array.size()-->14
97
I-->12array.size()-->13
I-->13array.size()-->13
I-->1array.size()-->13
16
I-->1array.size()-->12
I-->2array.size()-->12
I-->3array.size()-->12
39
I-->3array.size()-->11
I-->4array.size()-->11
I-->5array.size()-->11
58
I-->5array.size()-->10
I-->6array.size()-->10
I-->7array.size()-->10
85
I-->7array.size()-->9
I-->8array.size()-->9
I-->9array.size()-->9
9
I-->0array.size()-->8
I-->1array.size()-->8
I-->2array.size()-->8
45
I-->2array.size()-->7
I-->3array.size()-->7
I-->4array.size()-->7
76
I-->4array.size()-->6
I-->5array.size()-->6
I-->6array.size()-->6
25
I-->0array.size()-->5
I-->1array.size()-->5
I-->2array.size()-->5
70
I-->2array.size()-->4
I-->3array.size()-->4
I-->4array.size()-->4
30
I-->0array.size()-->3
I-->1array.size()-->3
I-->2array.size()-->3
99
I-->2array.size()-->2
I-->1array.size()-->2
I-->2array.size()-->2
57
90


最后剩下编号为90的人,有人能告诉我做对了吗?

#29


引用 23 楼 souldeviler 的回复:
引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + ……

r = 0; 只是一个初始化而已, 不初始化后边不让 return 其实没实际意义
i = 2 开始 是从数学的角度推算来的

#30


约瑟夫环 具体怎么我也没看过

#31


public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500];
for(int i=0; i<arr.length; i++) {
arr[i] = true;
}

int leftCount = arr.length;
int countNum = 0;
int index = 0;

while(leftCount>1) {
if(arr[index]==true) {
countNum++;
if(countNum == 3) {
countNum = 0;
leftCount--;
arr[index] = false;
}
}
index ++;

if(index == arr.length ) {
index = 0;
}
}

for(int i=0; i<arr.length ;i++) {
if(arr[i] == true) {
System.out.println(i);
}
}
}
}

#32


引用楼主 souldeviler 的回复:
有100个人围成一个圈(编号0-99),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩一个人为止,问此人原来的位置是多少号?(最好在有些重要的语句的时候附上点注释,谢啦!)

具体实现代码如下:
public class Quit3 {
public static void main(String[] args) {

boolean[] a = new boolean[100];
for(int i=0;i<a.length;i++) {
a[i] = true;
}

int count = 0;
int index = 0;
int NumLength = a.length;

while(NumLength >1) {
if(a[index] == true) {
count ++;
if(count==3) {
count=0;
a[index]=false;

NumLength --;
}
}

index ++;
if(index == a.length) {
index = 0;
        }    


}
for(int i=0;i<a.length;i++) {
if(a[i] == true) {
System.out.println(i);
}
}
}

}

#33


完全可以使用ArrayList,增添或者删除内部元素(相当于数据结构中的链表);

#34


引用 28 楼 fantasy0126 的回复:
import java.util.ArrayList;

public class Test {

public static void main(String[] args) throws Exception{

ArrayList<String> array=new ArrayList<String>();
for(int i=0;i<100;i++)
array.add(i+……

我得出的结果跟你一样。我的代码:

/**
 * 思路:0-99赋值,每个人都喊口号(p),如果口号是3的倍数,则赋值为 -1,即为出圈,同时记录出圈人的个数(count),
 * 首先判断是不是出圈了,没有出圈则看口号是不是3的倍数,是则出圈,否则继续喊口号(p++),如果出圈了,则不喊口号(p--)
 * 因为每次都是先喊口号,再判断出没出圈,所以当喊完口号后发现自己是出圈的,所以p--,就相当于自己没有喊口号 
 */
public class Array {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
int length =100; //数的个数
int a[] = new int[length]; //存放数的数组
//初始化
for(int i = 0;i <length;i++){
a[i] = i;
}

int p = 1; //计数器,一直增加,相当于口号
int k = 0;  //数组下标
int count = 0; //用于记录出圈的个数
while(true){
k = k%length;
//判断是否出圈
if(a[k] != -1){
//口号是不是3的倍数
if( (p%3) == 0){
a[k]=-1;
count ++;
}
}else{
//出圈了,不喊口号
p--;
}
//判断是不是倒数第二个出圈的,是则break掉
if(count <length-1 ){
p++;
k++;
}else{
break;
}
}
//找出最后一个人
for(int i = 0;i <length;i++){
if(a[i] != -1){
System.out.println(a[i]);
}
}
}
}

#35



class Test
{
    public static void main(String[] args)
    {
        int count = 100;
        //剩余人数
        int leavings = count;
        int[] all = new int[count];
        //index人物编号,counter报数
        int index = 0, counter = 0;
        while (true)
        {
            //人物对应的值为-1表示出局
            if (all[index] != -1)
            {
                all[index] = index+1;
                counter++;
            }
            if (counter%3 == 0)
            {
                if (--leavings == 1)
                {
                    System.out.println(all[index]);
                    break;
                }
                all[index] = -1;
            }

            index++;
            if (index == count-1)
            {
                index = 0;
            }
        }
    }
}

#36


来学习学习吧, 呵呵

#37



public class Test   
{   
    public static void main(String[] args)   
    {   
        // count人物总数,index人物编号,counter报数   
        int count = 100, index = 0, counter = 0;   
        // 剩余人数   
        int leavings = count;   
        // 圈   
        int[] circle = new int[count];   
        System.out.println("人物编号    报数");   
        while (true)   
        {   
            // 排的圈里的人物对应的值为-1表示出局   
            if (circle[index] != -1)   
            {   
                circle[index] = index + 1;   
                System.out.printf("%4d\t%3d\n", index, ++counter);   
            }   
               
            if (counter % 3 == 0 && circle[index] != -1)   
            {   
                if (leavings-- == 1)   
                {   
                    System.out.printf("最后一个:\n%4d\t%3d\n", index, counter);   
                    break;   
                }   
                circle[index] = -1;   
            }   
  
            if (++index == count)   
            {   
                System.out.println("剩余人数:" + leavings);   
                index = 0;   
            }   
        }   
    }   



最后结果是90

#38


谢啦,我已经结了!

#1


问题是不是报数的人只1,2,3的报数???

#2


不是。。。就是一般的数数,从1开始数,然后数到3的倍数的人就离开圈子。。。 所以首先都不知道一共要循环一次,就是假如说数完第一圈  从1 开始的  100个人过后   再转到第一个人的时候就数101,以此类推,只要是3倍数的人就出去,直到最后剩下一个!

#3


约瑟夫环问题

#4


引用 3 楼 java1109 的回复:
约瑟夫环问题

不懂。。。我才初学JAVA不久。

#5


引用 3 楼 java1109 的回复:
约瑟夫环问题

百度一下这个问题就OK了

#6


引用 1 楼 xin625201 的回复:
问题是不是报数的人只1,2,3的报数???

不过你这样想也可以的,就是100个人都喊1,2,3 喊到3的人就出去 , 问题就在于第二圈和后面的时候原来喊的人数字会有变化 比方说第一圈的时候 喊99的人喊3  那么第100个人的时候就喊1 原来第一圈喊1的人就喊2 了。。就是这个让我头疼!

#7


引用 6 楼 souldeviler 的回复:
引用 1 楼 xin625201 的回复:
问题是不是报数的人只1,2,3的报数???

不过你这样想也可以的,就是100个人都喊1,2,3 喊到3的人就出去 , 问题就在于第二圈和后面的时候原来喊的人数字会有变化 比方说第一圈的时候 喊99的人喊3 那么第100个人的时候就喊1 原来第一圈喊1的人就喊2 了。。就是这个让我头疼!

兄弟,强哦,压秒提交。。

#8



public static int lastValue(List list, int n){
while(true){
if(list.size() == 1)
break;
for(int i=0;i<n-1;i++){
list.add(list.remove(0));
}
list.remove(0);
}
return (Integer)list.get(0);
}

冒失这个题目我以前笔试过

#9


你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

#10


方法很多 可以用基本的数组解决 就是麻烦点 ,也可以用集合框架中的类来解决

#11


引用 9 楼 yudun1989 的回复:
你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

2虽然不是3的倍数,但是3就是3的倍数了撒。。假如剩下2个人,第一个人喊1 ,第二个人喊2,那么第一个人就喊3撒,。他就出去了。。还是剩下一个!

#12


引用 11 楼 souldeviler 的回复:
引用 9 楼 yudun1989 的回复:
你就设立一个100大小的数组,初始值为1,然后三个三个的循环遍历,每当数到3,然后把数组的值置0,输出剩下的最后一个数字的下标。

//我的问题是。。。最后怎么会只剩下一个人哦。。当最后是两个人的时候你怎么剔除?因为2不是3的倍数啊

2虽然不是3的倍数,但是3就是3的倍数了撒。。假如剩下2个人,第一个人喊1 ,第二个人喊2,那么第一个人就喊……

额。昏了昏了。恩。这样就明白了。弄两个循环,一个重复遍历100的数组,一个就从1-3数。就可以了。

#13


我帮你到网上找了一段代码,正好自己也可以研究一下这个定律,感觉这段代码还算不错,大家一起学习学习!

import java.util.Scanner;

public class Test {
    public static void main(String[] args){
     System.out.println("程序说明如下:");
     System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数," +
     "直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");         
     // 提示输入总人数
     System.out.println("请输入做这个游戏的总人数:");
     Scanner sca=new Scanner(System.in);
     int m=sca.nextInt();
     // 提示输入要出圈的数值
     System.out.println("请输入要出圈的数值:");        
        int n=sca.nextInt();
        System.out.println("按出圈的次序输出序号:");        
        // 创建有m个值的数组
        int[] a=new int[m];
        // 初始长度,以后出圈一个,长度就减一
        int len=m;
        // 给数组赋值
        for(int i=0;i<a.length;i++)
         a[i]=i+1;
        // i为元素下表,j代表当前要报的数
        int i=0;
        int j=1;
        while(len>0){
         if(a[i%m]>0){
         if(j%n==0){// 找到要出圈的人,并把圈中人数减一
         System.out.print(a[i%m]+"  ");
         a[i%m]=-1;
              j=1;
                i++;
                len--;
             }else{
                i++;
                j++;
             }
         }else{// 遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
            i++;
         }
    }
}

#14


这个我好好研究下!主要初学JAVA不久。。。这个循环貌似听过,但是就是自己没有遇到过,现在遇到了 感觉好难

#15


#16


import java.util.Vector;

public class Loop {

public static void main(String[] args) {
Vector<Integer> man = new Vector<Integer>(0);
for (int i=0;i<100;i++) {
man.add(i);
}
int i = 0;//用以数数
int num = 0;//用以控制数到头以后的序号翻转
while (man.size() > 1) {
i++;
if (i%3 == 0) {
System.out.println("移除:" + man.get(num));
man.remove(num);//3的倍数时移除该元素
num--;//移除之后的序号偏移
}
num++;
if (num >= man.size()) {
num -= man.size();
}
}
System.out.println("剩下:" + man.get(0));
}
}

#17




public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + step) % i;
return r;
}


这么长代码就够了

#18


学习中呢。谢谢啊。

#19




//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + step) % i;
return r;
}

#20


很好很强大..  正好研究下

#21


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r……

这个貌似有问题啊。。假如说是9个人一个桌子,最后出去的应该是8号。但是 用这个方法算的最后出去的是1号

#22


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r……

。。。。算错了  不好意思!

#23


引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
    public static int getLastone(int total, int step) {
        int r = 0;
        for (int i = 2; i <= total; i++)
            r = (r + step) % i;
        return r;


这个r一开始赋值为0,是不是说是从0号人开始?i 一开始赋值为2 是为什么啊?

#24


引用 8 楼 niemengwem 的回复:
Java code

public static int lastValue(List list, int n){
        while(true){
            if(list.size() == 1)
                break;
            for(int i=0;i<n-1;i++){
                list.a……


这是什么算法?

#25


该回复于2010-12-02 16:07:23被版主删除

#26


class Kid {
int num;

Kid left;
Kid right;
}

class Circle {
Kid kid[] = new Kid[100];
public void inCricle() {
for(int i=0;i<kid.length;i++) {
kid[i]=new Kid();
kid[i].num = i;
}
for(int i=1;i<kid.length-1;i++) {
kid[i].left=kid[i-1];
kid[i].right=kid[i+1];
}
kid[0].left=kid[kid.length-1];
kid[0].right=kid[1];
kid[99].left=kid[98];
kid[kid.length-1].right=kid[0];
}
public int getIndex() {
int count = 0 ;
while(true) {
for(int i=0;i<kid.length;i++) {
if(kid[i].left!=null&&kid[i].right!=null) {
count++;
}
if(count==3) {
kid[i].left.right=kid[i].right;
kid[i].right.left=kid[i].left;
kid[i].left=null;
kid[i].right=null;

count=0;
}
if((kid[i].left==kid[i])&&(kid[i].right==kid[i])) {
return kid[i].num;
}
}
}
}
public static void main(String []args) {
Circle c = new Circle();
c.inCricle();
System.out.println(c.getIndex());
}

}

#27


引用 13 楼 xin625201 的回复:
我帮你到网上找了一段代码,正好自己也可以研究一下这个定律,感觉这段代码还算不错,大家一起学习学习!

import java.util.Scanner;

public class Test {
  public static void main(String[] args){
  System.out.println("程序说明如下:");
  System.out.println……

#28


import java.util.ArrayList;

public class Test {

public static void main(String[] args) throws Exception{

ArrayList<String> array=new ArrayList<String>();
for(int i=0;i<100;i++)
array.add(i+"");

int num=1,i=0;
while(true){
if(array.size()==1)
break;
num++;
i++;
System.out.println("I-->"+i+"array.size()-->"+array.size());
if(i==array.size())
i=0;
if(num==3){
System.out.println(array.remove(i));

i--;
num=0;
}
}
System.out.println(array.get(0));
}
}

打印结果:
I-->1array.size()-->100
I-->2array.size()-->100
2
I-->2array.size()-->99
I-->3array.size()-->99
I-->4array.size()-->99
5
I-->4array.size()-->98
I-->5array.size()-->98
I-->6array.size()-->98
8
I-->6array.size()-->97
I-->7array.size()-->97
I-->8array.size()-->97
11
I-->8array.size()-->96
I-->9array.size()-->96
I-->10array.size()-->96
14
I-->10array.size()-->95
I-->11array.size()-->95
I-->12array.size()-->95
17
I-->12array.size()-->94
I-->13array.size()-->94
I-->14array.size()-->94
20
I-->14array.size()-->93
I-->15array.size()-->93
I-->16array.size()-->93
23
I-->16array.size()-->92
I-->17array.size()-->92
I-->18array.size()-->92
26
I-->18array.size()-->91
I-->19array.size()-->91
I-->20array.size()-->91
29
I-->20array.size()-->90
I-->21array.size()-->90
I-->22array.size()-->90
32
I-->22array.size()-->89
I-->23array.size()-->89
I-->24array.size()-->89
35
I-->24array.size()-->88
I-->25array.size()-->88
I-->26array.size()-->88
38
I-->26array.size()-->87
I-->27array.size()-->87
I-->28array.size()-->87
41
I-->28array.size()-->86
I-->29array.size()-->86
I-->30array.size()-->86
44
I-->30array.size()-->85
I-->31array.size()-->85
I-->32array.size()-->85
47
I-->32array.size()-->84
I-->33array.size()-->84
I-->34array.size()-->84
50
I-->34array.size()-->83
I-->35array.size()-->83
I-->36array.size()-->83
53
I-->36array.size()-->82
I-->37array.size()-->82
I-->38array.size()-->82
56
I-->38array.size()-->81
I-->39array.size()-->81
I-->40array.size()-->81
59
I-->40array.size()-->80
I-->41array.size()-->80
I-->42array.size()-->80
62
I-->42array.size()-->79
I-->43array.size()-->79
I-->44array.size()-->79
65
I-->44array.size()-->78
I-->45array.size()-->78
I-->46array.size()-->78
68
I-->46array.size()-->77
I-->47array.size()-->77
I-->48array.size()-->77
71
I-->48array.size()-->76
I-->49array.size()-->76
I-->50array.size()-->76
74
I-->50array.size()-->75
I-->51array.size()-->75
I-->52array.size()-->75
77
I-->52array.size()-->74
I-->53array.size()-->74
I-->54array.size()-->74
80
I-->54array.size()-->73
I-->55array.size()-->73
I-->56array.size()-->73
83
I-->56array.size()-->72
I-->57array.size()-->72
I-->58array.size()-->72
86
I-->58array.size()-->71
I-->59array.size()-->71
I-->60array.size()-->71
89
I-->60array.size()-->70
I-->61array.size()-->70
I-->62array.size()-->70
92
I-->62array.size()-->69
I-->63array.size()-->69
I-->64array.size()-->69
95
I-->64array.size()-->68
I-->65array.size()-->68
I-->66array.size()-->68
98
I-->66array.size()-->67
I-->67array.size()-->67
I-->1array.size()-->67
1
I-->1array.size()-->66
I-->2array.size()-->66
I-->3array.size()-->66
6
I-->3array.size()-->65
I-->4array.size()-->65
I-->5array.size()-->65
10
I-->5array.size()-->64
I-->6array.size()-->64
I-->7array.size()-->64
15
I-->7array.size()-->63
I-->8array.size()-->63
I-->9array.size()-->63
19
I-->9array.size()-->62
I-->10array.size()-->62
I-->11array.size()-->62
24
I-->11array.size()-->61
I-->12array.size()-->61
I-->13array.size()-->61
28
I-->13array.size()-->60
I-->14array.size()-->60
I-->15array.size()-->60
33
I-->15array.size()-->59
I-->16array.size()-->59
I-->17array.size()-->59
37
I-->17array.size()-->58
I-->18array.size()-->58
I-->19array.size()-->58
42
I-->19array.size()-->57
I-->20array.size()-->57
I-->21array.size()-->57
46
I-->21array.size()-->56
I-->22array.size()-->56
I-->23array.size()-->56
51
I-->23array.size()-->55
I-->24array.size()-->55
I-->25array.size()-->55
55
I-->25array.size()-->54
I-->26array.size()-->54
I-->27array.size()-->54
60
I-->27array.size()-->53
I-->28array.size()-->53
I-->29array.size()-->53
64
I-->29array.size()-->52
I-->30array.size()-->52
I-->31array.size()-->52
69
I-->31array.size()-->51
I-->32array.size()-->51
I-->33array.size()-->51
73
I-->33array.size()-->50
I-->34array.size()-->50
I-->35array.size()-->50
78
I-->35array.size()-->49
I-->36array.size()-->49
I-->37array.size()-->49
82
I-->37array.size()-->48
I-->38array.size()-->48
I-->39array.size()-->48
87
I-->39array.size()-->47
I-->40array.size()-->47
I-->41array.size()-->47
91
I-->41array.size()-->46
I-->42array.size()-->46
I-->43array.size()-->46
96
I-->43array.size()-->45
I-->44array.size()-->45
I-->45array.size()-->45
0
I-->0array.size()-->44
I-->1array.size()-->44
I-->2array.size()-->44
7
I-->2array.size()-->43
I-->3array.size()-->43
I-->4array.size()-->43
13
I-->4array.size()-->42
I-->5array.size()-->42
I-->6array.size()-->42
21
I-->6array.size()-->41
I-->7array.size()-->41
I-->8array.size()-->41
27
I-->8array.size()-->40
I-->9array.size()-->40
I-->10array.size()-->40
34
I-->10array.size()-->39
I-->11array.size()-->39
I-->12array.size()-->39
40
I-->12array.size()-->38
I-->13array.size()-->38
I-->14array.size()-->38
48
I-->14array.size()-->37
I-->15array.size()-->37
I-->16array.size()-->37
54
I-->16array.size()-->36
I-->17array.size()-->36
I-->18array.size()-->36
61
I-->18array.size()-->35
I-->19array.size()-->35
I-->20array.size()-->35
67
I-->20array.size()-->34
I-->21array.size()-->34
I-->22array.size()-->34
75
I-->22array.size()-->33
I-->23array.size()-->33
I-->24array.size()-->33
81
I-->24array.size()-->32
I-->25array.size()-->32
I-->26array.size()-->32
88
I-->26array.size()-->31
I-->27array.size()-->31
I-->28array.size()-->31
94
I-->28array.size()-->30
I-->29array.size()-->30
I-->30array.size()-->30
3
I-->0array.size()-->29
I-->1array.size()-->29
I-->2array.size()-->29
12
I-->2array.size()-->28
I-->3array.size()-->28
I-->4array.size()-->28
22
I-->4array.size()-->27
I-->5array.size()-->27
I-->6array.size()-->27
31
I-->6array.size()-->26
I-->7array.size()-->26
I-->8array.size()-->26
43
I-->8array.size()-->25
I-->9array.size()-->25
I-->10array.size()-->25
52
I-->10array.size()-->24
I-->11array.size()-->24
I-->12array.size()-->24
63
I-->12array.size()-->23
I-->13array.size()-->23
I-->14array.size()-->23
72
I-->14array.size()-->22
I-->15array.size()-->22
I-->16array.size()-->22
84
I-->16array.size()-->21
I-->17array.size()-->21
I-->18array.size()-->21
93
I-->18array.size()-->20
I-->19array.size()-->20
I-->20array.size()-->20
4
I-->0array.size()-->19
I-->1array.size()-->19
I-->2array.size()-->19
18
I-->2array.size()-->18
I-->3array.size()-->18
I-->4array.size()-->18
36
I-->4array.size()-->17
I-->5array.size()-->17
I-->6array.size()-->17
49
I-->6array.size()-->16
I-->7array.size()-->16
I-->8array.size()-->16
66
I-->8array.size()-->15
I-->9array.size()-->15
I-->10array.size()-->15
79
I-->10array.size()-->14
I-->11array.size()-->14
I-->12array.size()-->14
97
I-->12array.size()-->13
I-->13array.size()-->13
I-->1array.size()-->13
16
I-->1array.size()-->12
I-->2array.size()-->12
I-->3array.size()-->12
39
I-->3array.size()-->11
I-->4array.size()-->11
I-->5array.size()-->11
58
I-->5array.size()-->10
I-->6array.size()-->10
I-->7array.size()-->10
85
I-->7array.size()-->9
I-->8array.size()-->9
I-->9array.size()-->9
9
I-->0array.size()-->8
I-->1array.size()-->8
I-->2array.size()-->8
45
I-->2array.size()-->7
I-->3array.size()-->7
I-->4array.size()-->7
76
I-->4array.size()-->6
I-->5array.size()-->6
I-->6array.size()-->6
25
I-->0array.size()-->5
I-->1array.size()-->5
I-->2array.size()-->5
70
I-->2array.size()-->4
I-->3array.size()-->4
I-->4array.size()-->4
30
I-->0array.size()-->3
I-->1array.size()-->3
I-->2array.size()-->3
99
I-->2array.size()-->2
I-->1array.size()-->2
I-->2array.size()-->2
57
90


最后剩下编号为90的人,有人能告诉我做对了吗?

#29


引用 23 楼 souldeviler 的回复:
引用 19 楼 keeya0416 的回复:
Java code


//total 为总人数, step 为喊到 step 倍数的人退出, 方法返回的是最后一个人的原编号
public static int getLastone(int total, int step) {
int r = 0;
for (int i = 2; i <= total; i++)
r = (r + ……

r = 0; 只是一个初始化而已, 不初始化后边不让 return 其实没实际意义
i = 2 开始 是从数学的角度推算来的

#30


约瑟夫环 具体怎么我也没看过

#31


public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500];
for(int i=0; i<arr.length; i++) {
arr[i] = true;
}

int leftCount = arr.length;
int countNum = 0;
int index = 0;

while(leftCount>1) {
if(arr[index]==true) {
countNum++;
if(countNum == 3) {
countNum = 0;
leftCount--;
arr[index] = false;
}
}
index ++;

if(index == arr.length ) {
index = 0;
}
}

for(int i=0; i<arr.length ;i++) {
if(arr[i] == true) {
System.out.println(i);
}
}
}
}

#32


引用楼主 souldeviler 的回复:
有100个人围成一个圈(编号0-99),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩一个人为止,问此人原来的位置是多少号?(最好在有些重要的语句的时候附上点注释,谢啦!)

具体实现代码如下:
public class Quit3 {
public static void main(String[] args) {

boolean[] a = new boolean[100];
for(int i=0;i<a.length;i++) {
a[i] = true;
}

int count = 0;
int index = 0;
int NumLength = a.length;

while(NumLength >1) {
if(a[index] == true) {
count ++;
if(count==3) {
count=0;
a[index]=false;

NumLength --;
}
}

index ++;
if(index == a.length) {
index = 0;
        }    


}
for(int i=0;i<a.length;i++) {
if(a[i] == true) {
System.out.println(i);
}
}
}

}

#33


完全可以使用ArrayList,增添或者删除内部元素(相当于数据结构中的链表);

#34


引用 28 楼 fantasy0126 的回复:
import java.util.ArrayList;

public class Test {

public static void main(String[] args) throws Exception{

ArrayList<String> array=new ArrayList<String>();
for(int i=0;i<100;i++)
array.add(i+……

我得出的结果跟你一样。我的代码:

/**
 * 思路:0-99赋值,每个人都喊口号(p),如果口号是3的倍数,则赋值为 -1,即为出圈,同时记录出圈人的个数(count),
 * 首先判断是不是出圈了,没有出圈则看口号是不是3的倍数,是则出圈,否则继续喊口号(p++),如果出圈了,则不喊口号(p--)
 * 因为每次都是先喊口号,再判断出没出圈,所以当喊完口号后发现自己是出圈的,所以p--,就相当于自己没有喊口号 
 */
public class Array {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
int length =100; //数的个数
int a[] = new int[length]; //存放数的数组
//初始化
for(int i = 0;i <length;i++){
a[i] = i;
}

int p = 1; //计数器,一直增加,相当于口号
int k = 0;  //数组下标
int count = 0; //用于记录出圈的个数
while(true){
k = k%length;
//判断是否出圈
if(a[k] != -1){
//口号是不是3的倍数
if( (p%3) == 0){
a[k]=-1;
count ++;
}
}else{
//出圈了,不喊口号
p--;
}
//判断是不是倒数第二个出圈的,是则break掉
if(count <length-1 ){
p++;
k++;
}else{
break;
}
}
//找出最后一个人
for(int i = 0;i <length;i++){
if(a[i] != -1){
System.out.println(a[i]);
}
}
}
}

#35



class Test
{
    public static void main(String[] args)
    {
        int count = 100;
        //剩余人数
        int leavings = count;
        int[] all = new int[count];
        //index人物编号,counter报数
        int index = 0, counter = 0;
        while (true)
        {
            //人物对应的值为-1表示出局
            if (all[index] != -1)
            {
                all[index] = index+1;
                counter++;
            }
            if (counter%3 == 0)
            {
                if (--leavings == 1)
                {
                    System.out.println(all[index]);
                    break;
                }
                all[index] = -1;
            }

            index++;
            if (index == count-1)
            {
                index = 0;
            }
        }
    }
}

#36


来学习学习吧, 呵呵

#37



public class Test   
{   
    public static void main(String[] args)   
    {   
        // count人物总数,index人物编号,counter报数   
        int count = 100, index = 0, counter = 0;   
        // 剩余人数   
        int leavings = count;   
        // 圈   
        int[] circle = new int[count];   
        System.out.println("人物编号    报数");   
        while (true)   
        {   
            // 排的圈里的人物对应的值为-1表示出局   
            if (circle[index] != -1)   
            {   
                circle[index] = index + 1;   
                System.out.printf("%4d\t%3d\n", index, ++counter);   
            }   
               
            if (counter % 3 == 0 && circle[index] != -1)   
            {   
                if (leavings-- == 1)   
                {   
                    System.out.printf("最后一个:\n%4d\t%3d\n", index, counter);   
                    break;   
                }   
                circle[index] = -1;   
            }   
  
            if (++index == count)   
            {   
                System.out.println("剩余人数:" + leavings);   
                index = 0;   
            }   
        }   
    }   



最后结果是90

#38


谢啦,我已经结了!