|
发表于 2018-4-4 12:57:11
|
显示全部楼层
- import time
- def longestCollatz(n=1000001):
- start = time.time()
- collatzdict = {} #维护一个统一的collatz的统计字典,初始为[2:2]
- numlist = [True] * (n - 1) #默认所有数都未被‘挖掉’, 从2 开始
- maxnum = 2
- maxcnt = 2
- for i in range(2, n):
- count = 0
- num = i
- if numlist[i - 2] == True: #若一个数未被挖掉,计算数量
- while num != 1:
- num = num * 3 + 1 if num % 2 else num / 2
- count += 1
- if num in collatzdict: #若计算到某个步骤,产生了已经出现过的数,则直接加上该数的计数,计数结束
- count += collatzdict[num]
- break
- collatzdict[i] = count
- if count > maxcnt:
- maxcnt = count
- maxnum = i
- numlist[i - 2] = False
- if i < n / 2: #以i为基数,挖掉i的2的j次方倍的所有的数
- j = 1
- while i * pow(2, j) < n:
- if numlist[i] == True:
- numlist[i * pow(2, j) - 2] = False #挖掉第i个数2的j次方倍的数
- collatzdict[i * pow(2, j)] = collatzdict[i] + j
- if collatzdict[i * pow(2, j)] > maxcnt:
- maxcnt = collatzdict[i * pow(2, j)]
- maxnum = i * pow(2, j)
- j += 1
- # print list(sorted(collatzdict.items(), key=lambda x:x[1], reverse=True))[0]
- print maxnum, maxcnt
- print time.time() - start
- if __name__ == '__main__':
- longestCollatz()
复制代码
再改了一下,只需要找最大的,不需要最后排序字典的话,会快一点
|
|