-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProblem14-ver1.py
105 lines (73 loc) · 2.63 KB
/
Problem14-ver1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Code by lukegarbutt & @AmirMotefaker
# projecteuler.net
# https://projecteuler.net/problem=14
# Longest Collatz sequence
# Problem 14
# The following iterative sequence is defined for the set of positive integers:
# n → n/2 (n is even)
# n → 3n + 1 (n is odd)
# Using the rule above and starting with 13, we generate the following sequence:
# 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
# It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms.
# Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.
# Which starting number, under one million, produces the longest chain?
# NOTE: Once the chain starts the terms are allowed to go above one million.
# These links is very useful for solved this problem:
# https://lucidmanager.org/data-science/project-euler-14/
# https://github.com/lukegarbutt
def main():
current_longest_chain = 0
number_that_produced_chain = 0
x = 1
number_to_collatz_up_to = 100
while (x < number_to_collatz_up_to):
current_number = x
current_chain = 1
while (current_number != 1):
current_number = collatz(current_number)
current_chain += 1
if current_chain > current_longest_chain:
current_longest_chain = current_chain
print(x, current_chain)
current_chain = 1
x += 1
def collatz(number):
if number % 2 == 0:
number = number/2
else:
number = (number * 3) + 1
number = int(number)
return(number)
main()
# import time
# start_time = time.time() #Time at the start of program execution
# def main():
# current_longest_chain = 0
# number_that_produced_chain = 0
# x = 1
# number_to_collatz_up_to = 1000000
# dict_of_known_collatz = {}
# while(x < number_to_collatz_up_to):
# current_number = x
# current_chain = 1
# while(current_number != 1):
# if current_number in dict_of_known_collatz.keys():
# current_chain += dict_of_known_collatz[current_number]-1
# break
# current_number = collatz(current_number)
# current_chain += 1
# if current_chain > current_longest_chain:
# current_longest_chain = current_chain
# number_that_produced_chain = x
# dict_of_known_collatz[x] = current_chain
# current_chain = 1
# x += 1
# print('The longest chain was {}, the number that produced this chain was {}, this took {} seconds to find'.format(current_longest_chain, number_that_produced_chain, time.time()-start_time))
# def collatz(number):
# if number % 2 == 0:
# number = number/2
# else:
# number = (number * 3) + 1
# number = int(number)
# return(number)
# main()