24小时热门版块排行榜    

查看: 2348  |  回复: 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的回帖

chyanog

金虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
Mathematica和中的递归可以很方便的“记忆化”,很简洁但还是没有编译后的循环快:
Euler 工程 第14题:找最长的数列
CODE:
c@1 = 1; c@n_ := c@n = 1 + If[EvenQ@n, c[n/2], c[3 n + 1]];
Ordering[c /@ Range@1*^6, -1] // AbsoluteTiming


cf = Compile[{{n0, _Integer}},
   Block[{n = N@n0},
    Catch@Do[If[n == 1, Throw@i];
      n = If[FractionalPart[n/2] == 0, n/2, 3*n + 1],
      {i, 1*^8}]
    ], RuntimeAttributes -> Listable,
   CompilationTarget -> "C", RuntimeOptions -> "Speed"
   ];

Ordering[cf@Range@1*^6, -1] // AbsoluteTiming

10楼2013-10-05 01:49:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见