小兔生小兔的老问题,各位高手给看看我分析的对不对,先谢谢了(200分)

  • 主题发起人 主题发起人 凤舞九天
  • 开始时间 开始时间

凤舞九天

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有一种细胞,从出生后第3秒起每秒(发育成熟了)都产生一个新细胞,后代细胞长到第三秒后也一样,每秒又分裂一只细胞,假如所有细胞的寿命固定为100秒,问从第1个细胞出生后的第N秒,总共存在多少个细胞?

前100秒内,cell只增不减,序列如下,第n项的值等于(n-1)+(n-2):
1 2 3 4 5 6 7 8 9 10……秒数
1 1 2 3 5 8 13 21 34 55……Cell Number Per Second
大致实现如下:
//CellNumber是用户输入的数值
function TForm1.CellSum(CellNumber: Integer): Integer;
var
N1,N2,Temp,i: Integer;
begin
N1 := 1;
N2 := 1;
Temp := 1;
for i := 3 to CellNumber do
begin
Temp := N2+N1;
N2 := N1;
N1 := Temp;
end;
Result := Temp;
end;

100秒后,cell开始死亡,假设101秒作为细胞减少的头一秒:
101 102 103 104 105 106……秒数
1 0 1 1 2 3……cell died number per second

接上面函数,未贴出详细代码
if (CellNumber = 103) or (CellNumber = 101) then
begin
Result := Temp-1;
exit;
end;
if CellNumber >= 104 then
begin
Result := Temp-(CellNumber-103);
exit;
end;

请各位大侠给看看,分析是否正确,小鸟在这里万分感激了。
另外本算式的计算结果无穷大,我使用Int64,到达103之后数据就开始溢出,出现负值。请问还有别的比Int64更大数据类型吗?
 
各位大侠是嫌麻烦吧,谁批评的好,200分独得
 
建议你看一下程序求2^1000后面有多少个零?你的结果为无穷大,即使再大的数据类型都会溢出的。
 
>>请问还有别的比Int64更大数据类型吗?
好象沒有了。
用字符數組吧。
 
问题是我希望结果输入最少也要超过105之后啊
因为104之后开始正常的递增了,做演示很方便,这样看起来很不方便的。
各位大侠知道有这样的数据类型吗?
之后的数目几乎就是2^n次方了,开始翻倍了。
请大侠说说我的分析对不对,谢谢了。
 
lichdr兄:
能给写个例子吗
 
你的细胞生命不要那么长,例如50秒
用字符數組, 很麻烦, 基本上需做要类似加法器的功能,考虑进位...

 

你就不能从10秒就开始死啊?

sorry,看的时间太长,没见楼上已经给出类似建议。
 
老大,我还盼着细胞生下来就挂了呢,
没有人比我更期盼这小cell在第二秒就壮烈了
但题目就是这样啊
请各位大侠说说分析有没有错误,200全归您一个人。
 
或者这样,维护另外一个数字,到了1,000,000就加一(兆),最后算一下。
 
第107秒死亡的细胞数目将为5个,
细胞死亡后每秒产生的细胞数目要减少一个
 
呵呵,分析的话真没那么简单
1到100你前面的分析可以,101开始按照另外一个数列分析,就是绝对增加值数列,而不是把增加的算出来再碱掉死掉的。或者说,碱掉死掉的细胞的时候,该把死掉细胞数加上上一秒死掉数(一直加到第101秒的死掉数量)一起碱掉。
 
不行,算不下去了
我只算出101秒开始减少的数量为2,3,7,17,34,61
找不到规律,难道要用第归?
 
to xelloss
我觉得你的不对
第101秒的时候,第1秒出生的cell就会死亡,而第1秒只有1个,
第102秒的时候,第2秒出生的cell就会死亡,而第2秒的cell只有第一秒出生的那一个,所以死亡数为0;
第103秒的时候,第3秒出生的cell就会死亡,而第3秒只有2个,前面死了一个,所以只死了一个;
第104秒的时候,第4秒出生的cell就会死亡,而第4秒只有3个,前面死了二个,所以只死了一个;
第105秒的时候,第5秒出生的cell就会死亡,而第5秒只有5个,前面死了三个,所以只死了二个;
……此后cell的死亡数量开始按照出生的方法递增,如下所示:
101 102 103 104 105 106 107 108 109 ……
1 0 1 1 2 3 5 8 13……
不知正确与否,请各位富翁指点。
刚才分析的时候只算到106,还以为是简单的n+1递增,多谢weiwei81123指教
 
分析得沒錯,就是斐波那契數列。
主要就是大數的問題了。
用字符數組的話可以參照大數的乘法:比如N!,當N很大的時候。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=494104
當然你這個問題只是數列兩項的和。可以把步長放大點
 
to 凤舞九天
我说的序列是减少的数量,是相对于你前面增加数量而言的。
第101秒的时候,第1秒出生的cell就会死亡,而第1秒只有1个,(但是同时少生1个,所以减少2个,除非第一个临死还要生一个:)
第102秒的时候,第2秒出生的cell就会死亡,而第2秒的cell只有第一秒出生的那一个,所以死亡数为0;(由于第1秒出生的cell死亡,他生的累计2个该减少,再加上他自己=3个)
第103秒的时候,第3秒出生的cell就会死亡,而第3秒只有2个,前面死了一个,所以只死了一个;(同前原因,第1秒的4个 加上第1秒本来应该生的现在没生出来的第1个该生的1个 加上新死的1个和他该生的一个=7个)
靠,不行了,又晕了,反正如果这样算,最后你只要按你第一个序列算,最后碱掉我这个序列就是结果。

 
第n秒死亡的细胞数目为N(n-100)-N(n-101)
这样递增到200秒是对的,但200秒以后又不好算了.
我只能想到用数组保存前101秒的细胞数目,不知有没有好的办法
 
推算绝对减少数量的图(假设第6秒开死):
(如果不死的数量-现有数量=绝对减少数量:现有数量示意图)
89-45=44: ooooooooooooooooooooooooooooooooooooooooooooo
55-30=25: oooooooooooooooooooooooooooooo
34-21=13: ooooooooooooooooooooo
21-14=07: oooooooooooooo
13-10=03: oooooooooo
08-06=02: oooooo
5s :ooooo
4s :ooo
3s :oo
2s :o
1s :o
呵呵,前面算错了。
 
我觉得xelloss是对的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
777
import
I
I
回复
0
查看
855
import
I
后退
顶部