fpquenya
发表于 2010-7-28 11:05:42
很好,学习下数学算法
4216730
发表于 2010-7-28 11:28:31
自己先慢慢琢磨下先
kuailetiande
发表于 2010-7-28 21:25:15
我要瞧瞧……
psp7456
发表于 2010-7-28 23:49:50
看起来不是很复杂
zc640618
发表于 2010-7-29 14:13:56
我来学习一下,刚入门,多看一些...
psp7456
发表于 2010-7-30 11:39:47
本帖最后由 psp7456 于 2010-7-30 12:27 编辑
第一题:穷举法
local $B;自行车数量
local $C;三轮车数量
for $B=1 to 65
for $C=1 to 65
if $B+$C=65 and 2*$B+3*$C=150 then
MsgBox(4096, "答案", "自行车有" & $B &"辆,三轮车有" & $C & "辆")
exit
endif
next
next
psp7456
发表于 2010-7-30 12:23:08
本帖最后由 psp7456 于 2010-7-30 12:27 编辑
第二题:还是穷举法
local $M,$W,$C;M男人,W女人,C小孩
for $M=1 to 36
for $W= 1 to 36
for $C=2 to 36 step 2
if(4*$M+3*$W+0.5*$C=36) then
MsgBox(4096, "答案", "男人有" & $M &"个,女人有" & $W & "个,小孩有"& $C & "个")
endif
next
next
next
psp7456
发表于 2010-7-30 12:34:23
第三题:实在是没有必要编程解决吧?
local $X;X人数
for $X=1 to 100
if 5*$X+45=7*$X+3 then
MsgBox(4096, "答案", "人有" & $X &"个,羊价值" & 7*$X+3 & "元")
endif
next
tpj633
发表于 2010-7-30 12:38:06
算法很好,学习一下
psp7456
发表于 2010-7-30 13:30:51
第四题:迭代函数
思路如下
采取对称走取石头的方法,如三块石头的话ABC,从C开始走到B,然后从B走到A,再从A回到B完成。如5块石头的话ABCDE,从E开始走到C,然后从C开始走到A,再从A回到C,此时ABCDE已经变成BCD的样式,再从C走到D就完全变成了ABC的状态即回到了3块石头的问题。由这种思路建立迭代算法
F(1)=0
F(3)=F(1)+3*(3-1)/2+1*(1-1)/2
3块石头就是在1块石头的基础上增加了2块,还要多走3*(3-1)/2的距离才能变回1块石头的状态
F(5)=F(3)+3*(5-1)/2+1*(3-1)/2
5块石头就是在3块石头的基础上增加了2块,还要多走3*(7-1)/2的距离才能变回3块石头的状态,此时恰好位于中间部位,还要再走1*(5-1)/2才能回到最右侧,变成3块石头的状态。
F(7)=F(5)+3*(7-1)/2+1*(5-1)/2
…
…
F(X)=F(X-2)+3(X-1)/2+1*(X-2-1)/2 X是奇数
local $X
func psp($num)
if $num=1 then
return 0
else
return psp($num-2)+3*($num-1)/2+($num-2-1)/2
endif
endfunc
for $X=1 to 101 step 2
if psp($X)=300 then
MsgBox(4096, "答案", "有"&$X&"块石头")
endif
next
tpj633
发表于 2010-7-30 14:41:31
百鸡那个题有没有正解,不要列出可能的数据,直接要准确的
tpj633
发表于 2010-7-30 15:03:39
For $i= 0 To 100
For $x=0 To 100
$y=100-$i-$x
If $i*5+$y*3+$x/3=100 And $i>0 And $x>0 And $y>0 Then
MsgBox(0,"鸡鸡鸡","一共有"&$i&"公鸡,"&$y&"母鸡,"&$x&"小鸡")
ExitLoop
EndIf
Next
Next
小弟用楼主的方法改造了一下百鸡算法
tpj633
发表于 2010-7-30 15:45:16
买羊了
For $x=0 To $x*5+45
If $x*5+45=$x*7+3 Then
MsgBox(0,"人买羊",""&$x&"个人花了"&$x*5+45&"买羊")
ExitLoop
EndIf
Next
3mile
发表于 2010-7-30 16:15:47
本帖最后由 3mile 于 2010-7-30 16:19 编辑
石头问题,来个枚举1000米以内的可能。Local $temp,$fin
For $n=1 To 1000
$temp=Enumerate($n)
If Not @error Then
$fin&=$temp&"块石头"&"需要走"&$n&"米"&@CRLF
EndIf
Next
$input=InputBox("",$fin,"300","",200,400)
$Res=Enumerate($input)
If @error=1 Then
MsgBox(0,"","输入数据无解"&@CRLF&"输入框上有1000米以内枚举结果")
Else
MsgBox(0,0,"共有石头:"&Enumerate($input))
EndIf
Func Enumerate($m)
Dim $i = 1, $a, $y,$Result
While 1;计算一半石头数
$a += $i * 2;累加计算一半石头总里程数
$y = 2 * $a - $i;因为从右边开始取石头,则两边总里程数-最右边到中间的里程数
If $y = $m Then;判断结果
ExitLoop
ElseIf $y > $m Then ;数据溢出
$i = $m + 1;定义出错标志
ExitLoop
EndIf
$i+= 1
WEnd;循环结束
If $i <> $m + 1 Then
$Result = 2 * $i + 1
Return $Result
Else
Return SetError(1,0,"")
EndIf
EndFunc