本帖最后由 芒果加黄桃 于 2017-1-10 13:18 编辑 # encoding:utf-8
# Collatz问题
from time import time
def euler014(N):
tmp = N
count = 1
while tmp > 1:
count += 1
if tmp % 2 == 0:
tmp = int(tmp / 2)
else:
tmp = tmp * 3 + 1
return count
def euler014_next(num, l_result):
N = len(l_result)
t = num * 2
while t < N and l_result[t] == None:
l_result[t] = int(l_result[int(t / 2)]) + 1
t *= 2
t = num
if t % 2 != 0 and t * 3 + 1 < N and l_result[t * 3 + 1] == None:
t = t * 3 + 1
l_result[t] = l_result[num] - 1
t *=2
while t < N and l_result[t] == None:
l_result[t] = int(l_result[int(t / 2)]) + 1
t *= 2
if __name__ == '__main__':
start = time()
N = 1000000
l_result = [None] * (N + 1)
l_result[0],l_result[1] = 0,1
for i in range(2, N + 1):
if l_result[i] == None:
l_result[i] = euler014(i)
euler014_next(i, l_result)
print(max(l_result),'--',l_result.index(max(l_result)))
print('cost %.3f sec' % (time() - start))
|