package wulj;

 /**
* Java算法之“兔子问题”:
* 有一只兔子,从出生后第3个月起每个月都生只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
* @Description
* @author wulj
* @date 2018年6月1日
*/
public class WljTest {
/**
* 转化为数学问题如下:
* 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
* 2.假设第一个月的新兔子数为 :new,老兔子数为:old 即:a=new + old;,则 第二个月b= new + 2*old;
* 到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
* 3.化简后发现 a=new + old
* b= new + 2*old
* c= 2*new + 3*old
* 即:c= a + b;
* 因此转换为代码实现如函数:rabbitProblem()
*/
public static void rabbitProblem(){
int sum_rubbit;//每月的兔子总数
int pre_pre_rubbit = 1;//前两个月的兔子数
int pre_rubbit = 1;//前一个月的兔子数
for (int i = 3; i <= 12; i++) {
sum_rubbit = pre_pre_rubbit + pre_rubbit;
pre_pre_rubbit = pre_rubbit;
pre_rubbit = sum_rubbit;
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
}
}
public static int rabbitProblem_digui(int month){
int sum=0;
if(month == 1 || month == 2){
return 1;
}else{
sum = rabbitProblem_digui(month-1)+rabbitProblem_digui(month-2);
return sum;
} } /**
* 另外一种思路--转化为数学问题如下:
* 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
* 2.假设第一个月的新兔子数为 :new,老兔子数为:old 即:a=new + old;,则 第二个月b= new + 2*old;
* 到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
* 通过上面的规律我们发现:
* 当月的new的数量和上个月的old数量是相等的,当月的old的数量是上个月的new与上个月的old的数量之和,当月的总数量是当月的new和当月的old的数量之和
* 因此转换为代码实现如函数:rabbitProblem_new()
*/
public static void rabbitProblem_new(){
int sum_rubbit = 0;//每月的兔子总数
int new_rubbit = 1;//前两个月的兔子数
int old_rubbit = 0;//前一个月的兔子数
int temp_new = 0;
//第一个月:
for (int i = 1; i <= 12; i++) {
sum_rubbit = new_rubbit + old_rubbit;
temp_new = old_rubbit;
old_rubbit = old_rubbit + new_rubbit;
new_rubbit = temp_new;
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
}
} /**
* 递归方法
* @param i
* @param new_rubbit
* @param old_rubbit
*/
public static void rabbitProblem_new_digui(int i, int new_rubbit,int old_rubbit){
int sum_rubbit = 0;//每月的兔子总数
int temp_new = 0;
sum_rubbit = new_rubbit + old_rubbit;
if(i == 12){
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
return;
}else{
temp_new = old_rubbit;
old_rubbit = old_rubbit + new_rubbit;
new_rubbit = temp_new;
rabbitProblem_new_digui(i+1,new_rubbit,old_rubbit);
}
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit); }
public static void main(String[] args) {
rabbitProblem_new_digui(1,1,0);
}
}

Java算法之“兔子问题”的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  8. java算法----排序----(5)归并排序

    package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...

  9. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

随机推荐

  1. 【Android应用开发技术:用户界面】布局管理器

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  2. Atitit. IE8.0 显示本地图片预览解决方案 img.src=本地图片路径无效的解决方案

    Atitit. IE8.0 显示本地图片预览解决方案 img.src=本地图片路径无效的解决方案 1. IE8.0 显示本地图片 img.src=本地图片路径无效的解决方案1 1.1. div来完成  ...

  3. 解决 Netbeans Ant: taskdef class org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs cannot be found

    你在用Netbeans(实际上是Ant)Clean and Build你的项目生成可执行文件(例如Windows下的exe文件)时候遇到报错 或者遇到这样的报错: The libs.CopyLibs. ...

  4. poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配

    /** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...

  5. Oracle的REGEXP_INSTR函数简单使用方法

    REGEXP_INSTR函数让你搜索一个正則表達式模式字符串. 函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示開始或结束匹配的子位置.这取决于return_option參数的值. ...

  6. Tuning 15 Application Tuning

    oracle 是经过多年研发的, 通用的, 质量很高, 而application 是为客户定制的, 一次性的, 质量可能会出问题. 数据库的 move 的含义, 是将老表copy到新的表, 然后将新表 ...

  7. 日期类Date

    Java在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间.Date类中有很多方法在JDK1.0公布后已经过时了,在8.3中我们将介绍JDK1.0中新加的用 ...

  8. rgb2yuv

    1.rgb2yuv422p 代码的运算速度取决于以下几个方面 1. 算法本身的复杂度,比如MPEG比JPEG复杂,JPEG比BMP图片的编码复杂. 2. CPU自身的速度和设计架构 3. CPU的总线 ...

  9. MFC多国语言——资源DLL

    此随笔中主要内容来自http://blog.csdn.net/china_hxx/article/details/10066655,原出处不详. 以下内容基于VC 6.0.要实现界面多语言化,必须要先 ...

  10. gcc/g++实战之动态链接库与静态链接库编写

    函数库一般分为静态库和动态库两种. 静态库: 是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了.其后缀名一般为”.a”. 动态库: 与之相反, ...