欧拉计划 发表于 2023-7-5 18:35:14

题目14:找出100万以下最长的考拉兹序列

本帖最后由 欧拉计划 于 2023-8-5 23:11 编辑

题目14:找出100万以下最长的考拉兹序列

Longest Collatz sequence

The following iterative sequence is defined for the set of positive integers:

n → n/2 (n is even)
n → 3n + 1 (n is odd)

Using the rule above and starting with 13, we generate the following sequence:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms.

Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.

Which starting number, under one million, produces the longest chain?

NOTE: Once the chain starts the terms are allowed to go above one million.

题目翻译:

以下迭代序列定义在整数集合上:


[*]n → n/2 (当 n 是偶数时)
[*]n → 3n + 1 (当 n 是奇数时)

应用以上规则,并且以数字 13 开始,我们得到以下序列:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

可以看出这个以 13 开始以 1 结束的序列包含 10 个项。

虽然还没有被证明(考拉兹猜想),但是人们认为在这个规则下,以任何数字开始都会以 1 结束。

以哪个不超过 100 万的数字开始,能给得到最长的序列?

注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过 100 万的。


视频讲解:

https://www.bilibili.com/video/BV1pV411L7DV/


思路解析及源码参考(C & Python):

**** Hidden Message *****

歌者文明清理员 发表于 2023-7-5 18:37:49

首楼

欧拉计划 发表于 2023-7-5 18:40:53

歌者文明清理员 发表于 2023-7-5 18:37
首楼

不要光占楼不回答问题~

让我们一起享受思考带来的快乐吧!

{:5_105:}

歌者文明清理员 发表于 2023-7-5 18:50:15

欧拉计划 发表于 2023-7-5 18:40
不要光占楼不回答问题~

让我们一起享受思考带来的快乐吧!

def get_length(n):
    length = 0
    while n != 1:
      n = (3 * n + 1) if n % 2 else (n // 2)
      length += 1
    return length

longest_length = 0
longest_n = 0
for i in range(1, 100_0000):
    length = get_length(i)
    if length > longest_length:
      longest_length = length
      longest_n = i
print(longest_n)

837799

zhangjinxuan 发表于 2023-7-6 17:04:17

记忆化搜索好像会爆掉,数字最大可以达到 56991483520 {:10_266:}

只能暴力查找好像{:10_250:}

欧拉计划 发表于 2023-7-7 15:51:49

zhangjinxuan 发表于 2023-7-6 17:04
记忆化搜索好像会爆掉,数字最大可以达到 56991483520

只能暴力查找好像

可以优化,因为有非常多的冗余计算。

zhangjinxuan 发表于 2023-7-7 15:55:02

欧拉计划 发表于 2023-7-7 15:51
可以优化,因为有非常多的冗余计算。

如果不能全部记下来就很……恼)

鱼C-小师妹 发表于 2023-7-12 11:01:57

{:5_93:}

pixie99 发表于 2023-7-12 15:17:23

def Kolaz(n):
    count = 1
    while n != 1:
      if n % 2 == 0:
            n = n // 2
            count += 1
      elif n % 2 == 1:
            n = 3*n + 1
            count += 1
    return count

max_count = 1
for i in range(1000000,1,-1):
    count = Kolaz(i)
    if count > max_count:
      max_count = count
      t = i

print(t)
print(max_count)

Fxcjcj 发表于 2023-7-24 22:13:10

学习

Ly_悠然天下 发表于 2023-8-1 18:01:24

^_^

VPython999 发表于 2023-8-2 13:54:52

A={1:1}
def B():
    a=1
    m=1
    for i in range(2,1000001):
      count=0
      b=i
      while b!=1:
            if b in A:
                break
            elif b%2==0:
                b=b//2
            else:
                b=3*b+1
            count+=1
      A=count+A
      if m<A:
            a=i
            m=A
    return a,m


print(B())
(837799, 525)

鱼彧泽 发表于 2023-8-12 10:36:49

学习一下

auend 发表于 2023-8-12 12:29:31

这个是经典题

hone404 发表于 2023-8-16 13:41:23

学习

nkysp 发表于 2023-8-20 15:13:59

sharp46 发表于 2023-12-10 22:32:09

{:5_106:}

hejiage 发表于 2024-1-4 16:44:38

刷到第十四提了

1Asdusdhjssd 发表于 2024-2-4 21:07:45

学习了

kalendd 发表于 2024-2-19 22:49:59

{:9_241:}
页: [1]
查看完整版本: 题目14:找出100万以下最长的考拉兹序列