约瑟夫问题的最简求法,Java

最后一种可自定义总人数与循环数的大小噢
/**19. 据说著名犹太历史学家Josephus有过以下的故事:
     * 在罗马人占领乔塔帕特后,39 个犹太人与Josephus
     * 及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,
     * 于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,
     * 每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
     * 然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),
     * 并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。
     * 这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
     * 问题是,给定了和,一开始要站在什么地方才能避免被处决。
     * Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,
     * 于是逃过了这场死亡游戏。*/


方法一:把五的倍数存到数组a[]里面;最后比较元素大小,输出a[]中最大的元素。

package text;
public class Yue {
    

    
        public static void main(String[] args){
            int i;
            int []a=new int[12];
            int max=0;
            for(i=0;i<12;i++)
                {if ((i+1)%5==0)
                    a[i]=i+1;
                    if(a[i]>max)
                        max=a[i];
                }    
                System.out.println("最大的出局的号码是"+max);
                    
    }


}

方法二:既然要求最大的号码,就将整除循环的开始定在12,从上面筛选。

package text;

public class Yue3 {
    public static void main(String[] args) {
        int a=12;
        while(a>0) {
            if(a%5.0==0)
                break;
            a--;
        }
        System.out.println("最大的号码为"+a);
    }

}

方法三:方法二的进阶版:即可以自己定义输入的数字为多少:

package text;
import java.io.*;
public class Yue3 {
    public static void main(String[] args) {
        String str;
        int a;
        int b;
        try {
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));//那啥.......考来的,有了它才可以像输入啥就输入啥
            System.out.println("请输入参加游戏的总人数:");
            str=in.readLine();//输入的类型是字符类型的
            a=Integer.parseInt(str);//需要把字符类型的变量转化成整形赋值给a
            System.out.println("请输入参加游戏的循环数:");
            str=in.readLine();
            b=Integer.parseInt(str);
            while(a>0) {//从最大的数字开始循环
                if(a%b==0)
                    break;
                a--;
            }System.out.println("最大的号码为"+a);
            }catch (IOException e) {
                
            }
        
        
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值