Java算法之“兔子问题”
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算法之“兔子问题”的更多相关文章
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
- java算法 蓝桥杯 格子位置
问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...
- java算法----排序----(6)希尔排序(最小增量排序)
package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...
- java算法----排序----(5)归并排序
package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...
- java算法----排序----(4)快速排序
package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...
随机推荐
- @@identity、scope_identity()、IDENT_CURRENT('tablename')函数的区别
@@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...
- Windows+Nginx+IIS做图片分布式存储详细步骤
最近几天,一直在学习nginx在windows平台下的使用,为了寻找几种大量图片分布式存储而且有相对简单的存储方案 nginx是一种,还找到一种MongoDB GridFS 这两种方案我还是比较中意的 ...
- Android架构须知
1.了解不同版本号的特性包含IDE的. 如:AsyncTask3.0之后和之前的差别.Android 5.0的新的API.Android 6.0 不能用HttpClient .AS2.0的新特性 等等 ...
- 单元测试时使用Ninject的小问题
主要是Kernel没有被释放,Ninject的Kernel必须调用IDispose释放.也有可能是静态类型在VS单元测试时无法被释放. 先记录下这个问题
- Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc 1 浏览器判断一个页面的编码有俩个途径, 一种是通过HTTP响应头, 一个是通过meta: ...
- [svc][jk]gpu温度监测
在使用TensorFlow跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率.如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现. 1. 显示当前GP ...
- spring-pool.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- SQL Server DTS向导,字段转换出现202和200错误
当使用SQL Server 2012的DTS向导(Import and Export Data/导入导出数据)时,会出现如下问题: 当来源数据直接使用表的时候,没有任何问题 但如果来源数据是查询时,就 ...
- ubuntu12.10更新源
ubuntu12.10更新源 2013-03-10 20:48:17| 分类: Linux |字号 订阅 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就 ...
- c++11线程池实现
咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ...