找回密码
 加入
搜索
楼主: 3mile

[效率算法] 海盗分椰子的问题

 火... [复制链接]
发表于 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

这样验证不知道有什么问题?
发表于 2012-11-9 12:01:47 | 显示全部楼层
回复 16# haijie1223

你没有仔细看楼主的问题,注意原帖的这句:
早上大家都起床,各自心怀鬼胎的分椰子了,这个猴子还真不是一般的幸运,因为这次把椰子分成5分后居然还是多一个椰子,只好又给它了.
你上面的分析都是正确的,但是这几个只是夜里几个人做的,起床后呢?
按你上面的结果就是,起床后,剩余的就是
255*4=1020

再分:
1020/5=204

没有剩余了~~
发表于 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
发表于 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

评分

参与人数 1金钱 +40 收起 理由
3mile + 40 学习了

查看全部评分

发表于 2012-11-9 15:17:47 | 显示全部楼层
回复 1# 3mile

看看结果,嘻嘻
发表于 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就可以了。
对于这类问题,若真要用计算机来做(不用动脑子推出上面的公式的话),最简单就是迭代了。反正这类问题又没有多大的计算量。让计算机来套用上面公式来做就没有意思了,因为若数学和逻辑功底差了的,是推不出上面公式的,若已经推出来了,就根本用不上计算机了,直接口算也都几秒钟就出答案了。好象上面已经有人给出迭代了,我就不重造轮子了。并且这类迭代写法也是最简单好写的迭代

评分

参与人数 1贡献 +5 收起 理由
3mile + 5 果然很美的公式

查看全部评分

发表于 2012-11-11 18:44:18 | 显示全部楼层
回复 17# annybaby

确实,我也是漏了这句,刚刚算出3121很兴奋的说。看见你说3121是错的,我才去仔细读了楼主的题目,发现我算漏一次。
发表于 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)

评分

参与人数 1金钱 +35 收起 理由
3mile + 35 学习了

查看全部评分

发表于 2012-11-11 19:19:04 | 显示全部楼层
很经典的算数题哟
发表于 2012-11-12 09:59:12 | 显示全部楼层
看完了,一开始还以为2楼就是正确的呢,想通了
发表于 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

评分

参与人数 1金钱 +40 收起 理由
3mile + 40 终于出手了哈

查看全部评分

发表于 2012-11-13 12:36:40 | 显示全部楼层
学习学习
发表于 2012-11-13 17:06:42 | 显示全部楼层
呵呵,貌似很不错啊
发表于 2012-11-14 15:11:41 | 显示全部楼层
支持楼主l希望楼主多发精品好帖.....
发表于 2012-11-15 12:28:59 | 显示全部楼层
路过,学习一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 13:40 , Processed in 0.083782 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表