新细胞到第三个小时成熟,成熟后分裂出一个新的细胞,老的细胞每小时分裂出一个 新细胞,打印出每个 小时的细胞总数量; 初始成熟细胞是 一个;
哦!我以为第一个是新细胞。改了。
[code="java"]package test;
public class Count {
int[] cowNumber = new int[21];
public void count(int increaseCycle, int hours) { //传增长周期,和 用几个小时
cowNumber[0] = 1;
for (int currentHour = 1; currentHour <= hours; currentHour++) {
if (currentHour < increaseCycle) {
cowNumber[currentHour] = cowNumber[currentHour - 1] + 1;
} else {
cowNumber[currentHour] = cowNumber[currentHour - 1]
+ cowNumber[currentHour - increaseCycle + 1];
}
System.out.println("第" + (currentHour) + "小时:"+ cowNumber[currentHour]);
}
}
public static void main(String[] args) {
int increaseCycle = 3;//三小时后
int hours = 4;//第4小时
Count c = new Count();
c.count(increaseCycle, hours);
}
}[/code]
算法如下:(我测试了 :o :o )
[code="java"]package test;
public class Count {
int[] cowNumber = new int[21];
public void count(int increaseCycle, int hours) { //传增长周期,和 用几个小时
hours = hours -2;//第三年之后才分裂。
cowNumber[0] = 1;
for (int currentHour = 1; currentHour <= hours; currentHour++) {
if (currentHour < increaseCycle) {
cowNumber[currentHour] = cowNumber[currentHour - 1] + 1;
} else {
cowNumber[currentHour] = cowNumber[currentHour - 1]
+ cowNumber[currentHour - increaseCycle + 1];
}
System.out.println("第" + (currentHour+2) + "小时:"+ cowNumber[currentHour]);
}
}
public static void main(String[] args) {
int increaseCycle = 3;//三小时后
int hours = 4;//第4小时
Count c = new Count();
c.count(increaseCycle, hours);
}
}[/code]
[code="java"]
public class Cell {
private int age=0;
private boolean isOld=false;
public Cell(){
}
public Cell(int age){
this.age=age;
}
Cell newCell(){
Cell c=new Cell();
return c;
}
void addAge(){
age++;
if(age==3)isOld=true;
}
boolean isOld(){
return isOld;
}
public static void main(String...args) throws Exception{
ArrayList<Cell> ncs=new ArrayList<Cell>();
ArrayList<Cell> ocs=new ArrayList<Cell>();
Cell c=new Cell(1);
ncs.add(c);
while(true){
for(int i=0;i<ncs.size();i++){
Cell nc=ncs.get(i);
nc.addAge();
if(nc.isOld()){
ocs.add(ncs.remove(i));
i=i-1;
}
}
for(Cell oc:ocs){
Cell nc=oc.newCell();
ncs.add(nc);
}
Thread.sleep(1000);
System.out.println(ncs.size()+ocs.size());
}
}
}
[/code]
补充:
分析一下原理:
时间 数量(第几小时内分裂出来的,也就是增加的)
第1小时: 1 //假设新细胞是第一小时增加的
第2小时:
第3小时: 1 //表示已经成熟,分裂出来另一个来,
第4小时: 1 //
第5小时: 1 1 //第三小时分裂出来的已经成熟,并分裂一个
第6小时: 1 1 1 //
第7小时: 1 1 1 1 1 //后面两个是在第五小时内分裂的新细胞在这个时候成熟了
最后计算第几小时的数量,把第几小时之前(包括这个小时)的都加起来。比如第6小时的总细胞=3+2+1+1+1=8
修改一下补充:
分析一下原理:
时间 数量(第几小时内分裂出来的,也就是增加的)
第1小时: 1 //假设新细胞是第一小时增加的
第2小时: 1
第3小时: 1 1 //表示已经成熟,分裂出来另一个来,
第4小时: 1 1 1 //
第5小时: 1 1 1 1 1 //第三小时分裂出来的已经成熟,并分裂一个
第6小时: 1 1 1 1 1 1 1 1 //
第7小时: 1 1 1 1 1 1 1 1 1 1 1 1 1
最后计算第几小时的数量,把第几小时之前(包括这个小时)的都加起来,最后加上最开始的那个。比如第6小时的总细胞=13+8+5+3+2+1+1+1=34
可以用递归,递归的效率差很多。
本来这是一个跟著名递归的算法(Fibonacci数列)有联系的。
如果用递归的话,看看这篇文章讲的很详细。
[url=http://blog.csdn.net/richard_ma/archive/2006/05/02/705773.aspx]http://blog.csdn.net/richard_ma/archive/2006/05/02/705773.aspx[/url]
[quote]我 感觉不太对,你 仔细看下,第一个是成熟细胞 最后 是 个等差+1 的 一个 数列 应该 是 这样的 吧,
1,2,3,5,8,12 [/quote]
分析一下:由于原来是一个成熟的细胞,第一小时已经分裂出来一个。因此第一小时内细胞总数为2.
序列为:2 3 5 8 13 21 34 ...
规律:一个数为前面两者之和。