要求编写一个java程序:

15个地球人和15个火星人乘宇宙飞船访问嫦娥,中途遇到玉兔打劫,飞船受损,船长猪八戒告诉乘客,只有将全船一半乘客投入太空,才能避免全部去见玉帝。于是30个人围成一圈,由第... 15个地球人和15个火星人乘宇宙飞船访问嫦娥,
中途遇到玉兔打劫,飞船受损,船长猪八戒告诉乘客,
只有将全船一半乘客投入太空,才能避免全部去见玉帝。
于是30个人围成一圈,由第1个人数起,依次报数,数到
第9人,便把他投入大海中,然后再从他的下一个人数起,
数到第9人,再将他扔到大海中,如此循环地进行,直到
剩下15个乘客为止。结果15个火星人全部变成了宇宙卫星。
请问,地球人坐在了哪些位置以避免自己被抛出?
展开
 我来答
coclely
2013-05-18 · TA获得超过262个赞
知道小有建树答主
回答量:227
采纳率:100%
帮助的人:187万
展开全部

这个讲得麻烦,其实只是求循环顺序为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));
        }
    }
}
贾之0dz
2013-05-19
知道答主
回答量:2
采纳率:0%
帮助的人:2969
展开全部
11个,你算算吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蛊乐之颠
2013-05-18
知道答主
回答量:20
采纳率:0%
帮助的人:5.3万
展开全部
太麻烦了,不会
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式