24小时热门版块排行榜    

查看: 2337  |  回复: 9
本帖产生 4 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第14题:找最长的数列 已有6人参与

周末了,放个题出来玩玩:

定义一个正整数数列,其迭代公式为:
n = n/2 (当n为偶数)
n = 3n+1 (当n为奇数)

比如从n=13开始,计算这个数列得:
13 ->40->20->10->5->16->8->4->1
这个数列一共有10项。
这个数列是不是总收敛到1还是个没有解决的问题(称为Collatz Problem)
不过,我们并不是要解这个难题,而是要求在小于1百万的所有起始数中,哪个数能产生最长的数列。

这里要注意的是,数列中间的项是可以大于1百万的,要看提最后数列终止到1时候的长度。

PS:这东西不能用归纳法证出来吗?
PS2:注意1分钟原则啊。不过,大于1分钟的程序也可以发上来,这样才有的交流。

Here we go!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

微尘、梦想(程序强帖+1): 2011-05-21 19:19:52
matlab果然是不给力啊,Fortran版的只要0.75s
CODE:
Program euler14
    Implicit None
    Integer :: maxLen = 0, l
    Integer(8) :: n
    Integer :: start, maxStart
    Real :: t1, t2
    Call CPU_Time(t1)
   
    Do start = 2, 1000000
        n = start
        l = 0
        Do While (n .gt. 1)
            If(mod(n, 2) .eq. 0) Then
                n = n / 2
            Else
                n = 3*n + 1
            EndIf
            l = l + 1
        EndDo
        l = l + 1
        If(l .gt. maxLen) Then
            maxLen = l
            maxStart = start
        EndIf
    EndDo
    Call CPU_Time(t2)
    Print *, "Result:", maxStart, maxLen, t2-t1
End Program euler14

结果同libralibra同学。不过恐怖的是,中间项居然会大于40亿啊。32位整数都保存不了了。最后总共有525项。这东西用Mathematica的NestList展开会是什么样?

现在的计算机速度太快了,以至于我们都不想去找一个更好的解法了,不过,这东西的解空间应该还能减小,我看到2到3000以内都还是单调上涨的呢。
7楼2011-05-21 13:40:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


余泽成(金币+1): 谢谢参与交流! 2011-05-22 11:53:05
引用回帖:
Originally posted by wmc_1979 at 2011-05-21 20:04:41:
我计算出是     837799
项数  524

[ Last edited by wmc_1979 on 2011-5-21 at 20:38 ]

当n=1的时候,就退出循环了,所以认为最后计数的时候没有数1
9楼2011-05-22 09:08:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见