兔子数列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;
if(man[pos]==0)
i++;
if(i==per){
i = 0;
break;
}
} while(true);
man[pos] =count;
}
return man;
}
}