第14题:
根据数学家猜想,对一个任意自然数循环进行如下处理,最后总可以得到1:
如果是偶数: 除以2
否则:乘以3再加上1
找出100万以内,拥有最大步数的自然数。
- mark = [0] * 1000000
- mark[1] = 1
- def collatz(n):
- m = n
- while not (n<1000000 and mark[n]):
- n = n%2 and 3*n+1 or n/2
- mark[m] += 1
- mark[m] += mark[n]
- return mark[m]
- min = [0,0]
- for i in xrange(1,1000000):
- n = collatz(i)
- if n > min[0]:
- min = n,i
- print i,min,max(mark)
我曾尝试了几种算法来想提高速度,但或者收效微乎其微,或者适得其反。可能是因为我没有想出办法来减少循环次数,此次数至少为100万次。