guanhuaming
发表于 2010-5-18 10:39:11
谢谢056254628 的解答,能否把程序共享一下?俺苦于不会编程啊。
感激不尽。
056254628
发表于 2010-5-18 13:46:05
我是用VB语言的,给你不适用。
由于函数F(R,G,B)中B是不限范围的,很难用倒推的方法推出F(30,70,1)的值。
正推的话,如何处理F函数的重复计算,关系到程序的速度。
我的想法是记录F函数的使用情况,若使用过的就记录下来,下次求该值直接从该处找。
guanhuaming
发表于 2010-5-18 13:55:18
兄弟,你就把vb代码发给俺学习一下吧?好吗?
056254628
发表于 2010-5-18 20:57:56
本帖最后由 056254628 于 2010-5-18 21:23 编辑
Private Function f(ByVal R As Long, ByVal G As Long, ByVal B As Long) As String
Dim temp As Long
Dim k As Long
Dim str1 As String
Dim temp2 As Long
Dim Jieguo As Long
Jieguo=0
If G = 0 Then
If B <= 0 Then
f = 1
Else
temp = 2 ^ R - 1
If B Mod temp = 0 Then
f = B / temp
Else
f = B \ temp + 1
End If
End If
ElseIf R = 0 Then
If B <= -1 * G Then
f = G
Else
f = "∞"
End If
Else
k = 1
Do
str1 = f(R - 1, G, B - k)
If str1 = "∞" Then
k = k + 1
Else
temp = f(R, G - 1, B + k) + k
temp2 = CLng(str1) - k
If temp >= temp2 Then
If Jieguo = 0 Then
Jieguo = temp
Else
If temp < Jieguo Then
Jieguo = temp
End If
End If
f = Jieguo
Exit Function
Else
Jieguo = temp2
k = k + 1
End If
End If
Loop While True
End If
End Function
-----------------------------------------------------
此程序还没经过优化,计算稍大的数,速度很慢。
guanhuaming
发表于 2010-5-18 21:08:06
谢谢,我在我电脑上运行看看。
056254628
发表于 2010-5-18 21:58:27
我觉得递推公式可以简化到如下:
当R、G都大于0时
F(R,G,B)=F(R,G-1,B+k)+k k取满足F(R,G-1,B+k)+k >= F(R-1,G,B-k)-k 的最小正整数
056254628
发表于 2010-5-18 22:30:53
当R=1 时,由于 F(R-1,G,B-k)有时 会涉及到无解的问题,
所以将递推公式,写成如下:
$F(R,0,B)=Ceil(B/(2^R-1)) $ Ceil(X) 表示不小于X的最小整数。
$F(1,G,B)=(2^(G+1)-1)*B+(G-1)*2^(G+1)+2$
$ F(R,G,B)=F(R,G-1,B+k)+k $ k取 满足$F(R,G-1,B+k)+k >= F(R-1,G,B-k)-k$ 的最小正整数