考拉兹猜想是一个数学上的未解之谜,至今仍未解决,考拉兹猜想的内容如下:
对于自然数 n 循环执行如下操作 n n n 是偶数,用 n n n 除以 2 2 2 n n n 是奇数,用 n n n 乘以 3 3 3 后加 1 1 1如此循环操作,无论初始值是什么数字,最终都会得到 1 1 1 。2009年验证到了数字 5 , 764 , 607 , 523 , 034 , 234 , 880 5,764,607,523,034,234,880 5,764,607,523,034,234,880仍然满足这一猜想,但没有得到数学上的证明,就无法断言对于任何一个自然数都满足该猜想。这里我们的考拉兹猜想的改版为:若初始值 n n n 是一个偶数,也对 n n n 进行 n n n 乘以 3 3 3 加 1 1 1 的操作;后面数字的计算,按照考拉兹猜想来,考虑这样最后能够回到初始值的数字。
例如: 4 → 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 4 \to 13 \to 40 \to 20 \to 10 \to 5 \to 16 \to 8 \to 4 4→13→40→20→10→5→16→8→4,但初始值为 6 ,最终就不会是 1 。
求小于 10000 10000 10000 的偶数中,像上述的 2 2 2 或者 4 4 4 这样“能回到初始值的数”有多少个?
Python代码实现
def is_loop(num): n = num * 3 + 1 while n != 1: n = n * 3 + 1 if n % 2 else n // 2 if n == num: return True count = 0 for num in range(2, 10000, 2): count += 1 if is_loop(num) else 0 print(count) # 34Python代码实现
def is_loop(n): global num if n == 1: return False elif n == num: return True else: return is_loop(n=n*3+1 if n%2 else n//2) num = None count = 0 for n in range(2, 10000, 2): num = n if is_loop(n*3+1): #将第一步的结果作为输入 print(n, end=' ') #打印符合要求的数字 count += 1 print('\n', count) # 2 4 8 10 14 16 20 22 26 40 44 52 106 184 206 244 274 322 526 650 668 790 866 976 1154 1300 1438 1732 1780 1822 2308 2734 3238 7288 # 34