兔子数列Fibonacci 和 约瑟夫环

兔子数列Fibonacci 和 约瑟夫环

package arithmetic;

/**
 *  又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)
 *  以兔子繁殖为例子而引入,故又称为“兔子数列”,
 *      指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
 *      方法定义:F(0)=0,F(1)=1,   F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
 *          
 *          1)扩展:输出前15项的值
 *          2)扩展:求前15项的和的值
 *
 * 
 * 约瑟夫环问题
 *      有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
 *      凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
 *
 * @author sunRainAmazing
 *
 */
public class Fibonacci {

    public static void main(String[] args) {

        getFibonacciEvery(15);
        System.out.println("第"+15+"月的兔子数"+getFibonacciNumber(15));
        System.out.println("第"+15+"月的兔子和数"+getFibonacciSum(15));



        int[] man =getJosephusArray(41,3);
        int alive =2;//表示要存活的人数
        System.out.println("约瑟夫数字排列:");
        for(int i =0; i<41; i++){
           System.out.print(man[i] +" ");
        }

        System.out.println();
        System.out.println("L表示2个存活的人要放的位置:也就是40 和 41 对应的数字的位置");
        System.out.println("约瑟夫字母排列:");
        for(int i=0; i<41; i++) {
            if(man[i]>(41-alive))
               System.out.print("L");
            else
               System.out.print("D");

            if((i+1)%5 ==0)
               System.out.print("  ");
          }

    }




    /**
     * 求单个月的兔子的数
     * @param number 月数
     * @return 
     */
    public static int getFibonacciNumber(int number){
        if (number > 2)
            return getFibonacciNumber(number-1)
                        +getFibonacciNumber(number-2);
        else
            return 1;
    }





    /**
     *  输出每月的兔子数
     * @param number
     * @return
     */
    public static void getFibonacciEvery(int number){
        for (int i = 1; i <=number; i++) {
            System.out.print(getFibonacciNumber(i)+"\t");
        }
        System.out.println();
    }




    /**
     *  兔子数列求 和
     * @param number
     * @return
     */
    public static int getFibonacciSum(int number){
        int sum=0;
        for (int i = 1; i <=number; i++) {
            sum+=getFibonacciNumber(i);
        }
        return sum; 
    }





    /**
     * 据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,
     * 39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不
     * 要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,
     * 每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
     * 然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从
     * ,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
     * @param number
     * @param per
     * @return 
     */
     public static int[] getJosephusArray(int number,int per){
        int[] man = new int[number];
        for(int count=1,i=0,pos=-1;count<=number;count++){
            do {
                pos=(pos+1)%number;// 环状处理
                //System.out.print(pos+"; ");
                if(man[pos]==0)
                    i++;
                if(i==per){// 报数 3
                  i = 0;
                  break;
                }
            } while(true);
            man[pos] =count;
        }
        return man;
     }


}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值