-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0014_longest_collatz_sequence.cpp
More file actions
73 lines (57 loc) · 2.22 KB
/
0014_longest_collatz_sequence.cpp
File metadata and controls
73 lines (57 loc) · 2.22 KB
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
/**********************
Author: Daniel Bowder
Date: August 13, 2018
Problem: https://projecteuler.net/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."
***********************/
#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
double longest_collatz_sequence(double upperLimit) {
// Create variables to hold our max discovered value so we can return it later
double maxStart = 0;
int maxSteps = 0;
// For each number from 1 to the upperLimit defined by the user
for (int i=1;i<upperLimit;i++) {
// Prepare a step counter, a while loop stop condition
int stepCount = 1;
bool finished = false;
// Set ii to be our variable we can modify and play with for this iteration.
double ii = i;
// While we're not done,
while (!finished) {
// Check the nubmer is 1,
if ( ii == 1 ) {
// If the number is 1, we've met our win-condition, and we can break.
break;
} else if (1 == fmod(ii,2)) {
// If the number is even, preform the even operation and go again.
ii = ((3*ii) + 1);
stepCount++;
} else {
// If the number is odd, preform the odd operation and go again.
ii = (ii/2);
stepCount++;
}
}
// If the number we're on currently has a higher step-count than the current maximum,
// set this number to the maximum values.
if (stepCount > maxSteps) {
maxSteps = stepCount;
maxStart = i;
}
}
// Return our start value with the maximum step size.
return maxStart;
}
int main(int argc, char* argv[]) {
cout << "Problem 14. " << longest_collatz_sequence(1000000) << endl;
}