为了账号安全,请及时绑定邮箱和手机立即绑定

有一道java编程题求组

有一道java编程题求组

慕粉1350509337 2017-03-06 23:03:03
有500个小朋友,围成一个圈,从第一个开始数1,数到3的小朋友退出,后面继续从1开始数,数到3的小朋友退出,这样执行下去,最后留下的小朋友是哪个我还没有学动态数组,用基本数组与循环应该如何写这个,求思路啊,头发都要想掉了就是转不出来
查看完整描述

3 回答

?
姑姑鸟

TA贡献2条经验 获得超0个赞

public static void main(String[] args) {


int[] all = new int[500];


for (int i = 0; i < 500; i++) {

all[i] = i + 1;

}


while (all.length >= 3) {

int length = all.length;

int j = 0;

for (int i = 0; i < length; i++) {

if ((i + 1) % 3 == 0) {

all[i] = 0;

} else {

j++;

}

}

int[] newary = new int[j];

int a = 0;

for (int i = 0; i < length; i++) {

if (all[i] != 0) {

newary[a++] = all[i];

}

}

all = new int[j];

all = newary;

}

for (int i = 0; i < all.length; i++) {

System.out.println(all[i]);

}

}


查看完整回答
反对 回复 2017-03-07
?
AScorpio

TA贡献18条经验 获得超10个赞

简单讲一下下思路吧,设一个数组,里面有500个1,被踢掉就从1变成0,用循环加判断语句执行
查看完整回答
反对 回复 2017-03-07
?
MinRam

TA贡献87条经验 获得超24个赞

典型的约瑟夫环问题。

  1. 最普通的方式就是模拟整个过程,建立boolean数组,true表示此人已出列,false表示此人还在圈子中。模拟整个过程。时间复杂度为(3*500)(如果不懂可以再追问)

  2. 用数学方法得到递推公式:F(i) = ( F(500-1)+3 )%500


  3. public class ProgramTest {
        public static void  main(String[] args) {
            final int N =500;
            final int M =3;
            
            int result =0;
            for(int i=2;i<=N;++i){
                result = (result+M)%i
            }
            
            System.out.print(result);
            
        }
    }
查看完整回答
反对 回复 2017-03-07
  • 3 回答
  • 0 关注
  • 1575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信