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

路过,学习一下
页: 1 [2] 3
查看完整版本: 海盗分椰子的问题