|
发表于 2016-5-10 13:44:53
|
显示全部楼层
本帖最后由 holdme 于 2016-5-13 16:08 编辑
- import time
- start = time.clock()
- def find_long_chain():
- '''思路是在迭代过程中,记录下出现的每个1000000内的数字对应的长度,下次计算过程中进行搜索,如果已有记录则直接跳出'''
- limit = 1000000
- chain_length = [0]*limit
- rec = [0, 0] # 记录最大值
- for i in range(2,limit):
- trace_num = []
- n, cou = i, 1 # 计数器
- while n>1:
- if n<limit:
- if chain_length[n]>0:
- cou += chain_length[n] - 1
- break
- trace_num.append(n)
- if n%2 == 0:
- n = int(n/2)
- else:
- n = 3*n + 1
- cou += 1
- if cou>rec[1]: rec = [i, cou] # 更新最大值
- for j in range(len(trace_num)):
- if trace_num[j]<limit: chain_length[trace_num[j]] = cou - j
- return rec
- print('1000000以内能得到最长序列的数字是 %d, 序列长度为 %d'%(find_long_chain()[0],find_long_chain()[1]))
- print('计算用时%s秒'%str(time.clock()-start))
复制代码
结果是:
- 1000000以内能得到最长序列的数字是 837799, 序列长度为 525
- 计算用时3.8111777087706287秒
复制代码
附加题:
答案是: |
评分
-
查看全部评分
|