haijie1223
发表于 2012-11-9 11:15:26
本帖最后由 haijie1223 于 2012-11-9 11:18 编辑
回复 12# annybaby
为什么3121是不对的?
验证3121:
第一个人分成5份余1个,3121 = 624 * 5 +1
第二个人分成5份余1个,624 * 4 =499 * 5 +1
第三个人分成5份余1个,499 * 4 =399 * 5 +1
第四个人分成5份余1个,399 * 4 =319 * 5 +1
第五个人分成5份余1个,319 * 4 =255 * 5 +1
这样验证不知道有什么问题?
annybaby
发表于 2012-11-9 12:01:47
回复 16# haijie1223
你没有仔细看楼主的问题,注意原帖的这句:早上大家都起床,各自心怀鬼胎的分椰子了,这个猴子还真不是一般的幸运,因为这次把椰子分成5分后居然还是多一个椰子,只好又给它了.你上面的分析都是正确的,但是这几个只是夜里几个人做的,起床后呢?
按你上面的结果就是,起床后,剩余的就是
255*4=1020
再分:
1020/5=204
没有剩余了~~
haijie1223
发表于 2012-11-9 14:21:28
回复 17# annybaby
哦 确实是,我没仔细看,漏掉一次。
Dim $i = 0
Dim $total
Do
$i = $i + 1
$total = tg($i)
Until IsInt($total)
MsgBox(0, "答案", "椰子最少有 " & $total & "个。")
Func tg($f)
Local $a, $b, $c, $d, $g
$e = (5 * $f) / 4 + 1 / 4
$d = (5 * $e) / 4 + 1 / 4
$c = (5 * $d) / 4 + 1 / 4
$b = (5 * $c) / 4 + 1 / 4
$a = (5 * $b) / 4 + 1 / 4
$g = 5 * $a + 1
Return $g
EndFunc ;==>tg
haijie1223
发表于 2012-11-9 14:28:18
改一下写法:
Dim $i = 0
Dim $total
Do
$i = $i + 1
$total = tg($i)
Until IsInt($total)
MsgBox(0, "答案", "椰子最少有 " & (5 * $total + 1) & "个。")
Func tg($a)
For $i = 1 To 5
$a = (5 * $a + 1) / 4
Next
Return $a
EndFunc ;==>tg
leon460
发表于 2012-11-9 15:17:47
回复 1# 3mile
看看结果,嘻嘻
happytc
发表于 2012-11-9 21:18:45
回复 1# 3mile
哈,这个问题,在中学上奥数时就把玩过。
最美的最有趣的答案就是:-4
最中规中举的答案就是:15621
最美而又最简单的公式就是:Number = K * N^(N+1) - M * ( N - 1 )
(其中:k是系数,N代表海盗数,M指每次分给猴子的椰子数;Number就是指总的椰子数)
对于一楼的问题,就套用上面公式:要‘最少’,令k=1,N=5,M=1就可以了。
对于这类问题,若真要用计算机来做(不用动脑子推出上面的公式的话),最简单就是迭代了。反正这类问题又没有多大的计算量。让计算机来套用上面公式来做就没有意思了,因为若数学和逻辑功底差了的,是推不出上面公式的,若已经推出来了,就根本用不上计算机了,直接口算也都几秒钟就出答案了。好象上面已经有人给出迭代了,我就不重造轮子了。并且这类迭代写法也是最简单好写的迭代
cjb292721
发表于 2012-11-11 18:44:18
回复 17# annybaby
确实,我也是漏了这句,刚刚算出3121很兴奋的说。看见你说3121是错的,我才去仔细读了楼主的题目,发现我算漏一次。
cjb292721
发表于 2012-11-11 18:51:56
我的代码很简单,没再加Func。
假设椰子数为$i,$i减去分给猴子的1个,刚好能分成5份,就是($i-1)/5。然后偷偷藏了1份,剩下4份,就是(($i-1)/5)*4。5个人都做了同样的事情,就是重复计算5次。起床后再分成5份还能剩一个,就再计算1次,总共就是分了6次。只要分完的数是整数,就结束循环输出结果。
Dim $i=0
Do
$i=$i+1
$a=(($i-1)/5)*4
$b=(($a-1)/5)*4
$c=(($b-1)/5)*4
$d=(($c-1)/5)*4
$f=(($d-1)/5)*4
$g=(($f-1)/5)
Until IsInt($g)
MsgBox(0,"",$i)
qq82015930
发表于 2012-11-11 19:19:04
很经典的算数题哟
seniors
发表于 2012-11-12 09:59:12
看完了,一开始还以为2楼就是正确的呢,想通了
seniors
发表于 2012-11-13 10:23:44
发现我这一个蛮快的,发一下
Local $itime = TimerInit()
MsgBox(0, TimerDiff($itime), test(1, 6))
;参数依次为:每堆个数,分几次,记录当前最后一次分到的个数
Func test($num, $lever, $i = 1)
$num = $num * 5 + 1
If $lever = 1 Then
Return $num
Else
If Mod($num, 4) = 0 Then
Return test($num / 4, $lever - 1, $i)
Else
Return test($i + 1, 6, $i + 1)
EndIf
EndIf
EndFunc ;==>test
881966
发表于 2012-11-13 12:36:40
学习学习{:face (310):}
huangke
发表于 2012-11-13 17:06:42
呵呵,貌似很不错啊
sanmoking
发表于 2012-11-14 15:11:41
支持楼主l希望楼主多发精品好帖.....
kenan
发表于 2012-11-15 12:28:59
路过,学习一下