作业帮 > 综合 > 作业

要求编写一个java程序:

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/26 20:45:22
要求编写一个java程序:
15个地球人和15个火星人乘宇宙飞船访问嫦娥,
中途遇到玉兔打劫,飞船受损,船长猪八戒告诉乘客,
只有将全船一半乘客投入太空,才能避免全部去见玉帝.
于是30个人围成一圈,由第1个人数起,依次报数,数到
第9人,便把他投入大海中,然后再从他的下一个人数起,
数到第9人,再将他扔到大海中,如此循环地进行,直到
剩下15个乘客为止.结果15个火星人全部变成了宇宙卫星.
请问,地球人坐在了哪些位置以避免自己被抛出?
这个讲得麻烦,其实只是求循环顺序为9 的倍数的位置 .剩余的就是地球人的位置.代码待会儿试着写个看看.
被扔出的位置已经算出来了.第1轮抛出:位置:09第2轮抛出:位置:18第3轮抛出:位置:27第4轮抛出:位置:06第5轮抛出:位置:16第6轮抛出:位置:26第7轮抛出:位置:07第8轮抛出:位置:19第9轮抛出:位置:30第10轮抛出:位置:12第11轮抛出:位置:24第12轮抛出:位置:08第13轮抛出:位置:22第14轮抛出:位置:05第15轮抛出:位置:23
整下整个的代码.import java.util.ArrayList;
import java.util.List;
public class CirclePlus {
    private List<String> seats = new ArrayList<String>();
    //初始化
    public CirclePlus(){
        if(seats.size()>=0){
            for(int i=0;i<30;i++){
                seats.add("位置:"+((i+1)>=10?(i+1):"0"+(i+1)));
            }
        }
    }
       
    //踢人方法
    public void Kick(int num){
        //记录当前被踢人的座位
        int tempseat = 0;
        //当前要踢的座位
        int nowseat = 0;
        //记录当前是第几轮
        int loop = 1;
        //当是15轮时退出
        while(loop<=15){
            //要踢的人的座位号是上次被踢的座位号+num,-1是因为LIST的编号比真实座位号小1
            nowseat = tempseat+num-1;
//          System.out.println("nowseat=="+nowseat+"\ntempseat=="+tempseat+"\nloop=="+loop);
            //如果要踢的超出当前人数范围,则从第一个人开始重新算起(减掉当前人数)
            if(nowseat>=seats.size()){
                //为符合上面踢人座位号(nowseat)计算,除去减掉当前人数(seats.size())外,要加回修正值(上面减掉的1),
                //以保证 要踢人的座位号(nowseat) 是正确的
                tempseat=nowseat-seats.size()-num+1;
                   
            }else{
                //踢人
                System.out.println("第"+loop+"轮抛出:"+seats.remove(nowseat));
                //保存当前被踢的座位号
                tempseat = nowseat;
                //轮次增加
                loop++;
            }
        }
        System.out.println("踢人后剩余的安全座位号:");
        for(String string: seats){
            System.out.println(string);
        }
    }
    public static void main(String[] args) {
        CirclePlus cp = new CirclePlus();
        cp.Kick(9);
    }
}

OK了,换成while循环才弄好.用for循环直接算座位号误差太大了,还是一个个算.
再问: 这是我自己写的,有问题,帮我看看吧
再答: 你就不能直接放代码么,为什么截图。。。这样我都没法测试。
算了,我自己手打个。。
你这个代码有问题啊。。算法和我原来用for循环的一样,没法得到正确的答案:修正以后的代码:import java.util.ArrayList;
public class AirShip {
    public static void main(String[] args) {
        int i = 0, j = 8, flag = 30;
        ArrayList<Integer> ii = new ArrayList<Integer>();
        for (; i < 30; i++) {
            ii.add(i);
        }
        do {
            if (j < flag) {
                System.out.println(j + "          " + flag);
                ii.remove(j);
                j += 9;
                flag--;
            } else {
                flag = ii.size();
                j = j  - flag;
                   
            }
        } while (flag != 15);
        for (i = 0; i < 15; i++) {
            System.out.println(ii.get(i));
        }
    }
}
再问: = =!但是出现这样的问题是为什么?额,还有我第一次的那个的问题出现的原因是什么?
谢谢!我会给加分的!
再答: 你出现这个问题的原因是没有及时更新flag , 导致当前人数为15时flag还是16。这样你还会直接调用 remove 方法,造成下标越界。 至于算法。我前面就说过了不能直接算座位号。误差很大。至于原因是 这个题目看起来是有规律的,但是循环过后规律就打乱了。你不知道当前循环中间有几个是已经被删除的。固定一个值的话就会出现误差。 这个还是建议你先把所有可能算出来。再编写之后进行对比。看误差点在哪里。 比如删除的顺序 是 9 18 27 6 16 26 7 19 20 30 。。。 至少你删除的顺序要是这样才是正常的。 另外,你有没有把我的代码拿去测试,有没有使用DEBUG进行跟踪?进而理解我为什么是那样写的? 我感觉上你是没有仔细看过我的代码。因为你上次贴出来的代码仍然考虑不全面。不论是用do while循环 while循环。还是for循环。只要算法是对的,都能写出来,我也只是感觉上while循环是比较好写的就直接用上了。如果要用do .. while 循环也是可以写的,不过没有意义。因为算法是一模一样的。
再问:   额,我看了看,确实是算法的问题导致了越界,size大小是每抛出一个后就会变的,我在这个方面出错了,修改后ok了。谢谢!