题目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
首楼
不要光占楼不回答问题~
让我们一起享受思考带来的快乐吧!
{:5_105:}
欧拉计划 发表于 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 记忆化搜索好像会爆掉,数字最大可以达到 56991483520 {:10_266:}
只能暴力查找好像{:10_250:} zhangjinxuan 发表于 2023-7-6 17:04
记忆化搜索好像会爆掉,数字最大可以达到 56991483520
只能暴力查找好像
可以优化,因为有非常多的冗余计算。 欧拉计划 发表于 2023-7-7 15:51
可以优化,因为有非常多的冗余计算。
如果不能全部记下来就很……恼) {:5_93:} 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) 学习 ^_^ 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) 学习一下 这个是经典题 学习 好 {:5_106:} 刷到第十四提了 学习了
{:9_241:}
页:
[1]
2