-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathp14.cpp
More file actions
77 lines (73 loc) · 1.7 KB
/
Copy pathp14.cpp
File metadata and controls
77 lines (73 loc) · 1.7 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
74
75
76
77
/**
* The following iterative sequence is defined for the set of positive
* integers:
*
* n -> n / 2 (n is even)
* n -> 3 * n + 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 <cstdint>
#include <iostream>
#include "euler.h"
BEGIN_PROBLEM(14, solve_problem_14)
PROBLEM_TITLE("Longest sequence under 1,000,000 for Collatz Problem")
PROBLEM_ANSWER("837799")
PROBLEM_DIFFICULTY(1)
PROBLEM_FUN_LEVEL(2)
PROBLEM_TIME_COMPLEXITY("N*L")
PROBLEM_SPACE_COMPLEXITY("1")
PROBLEM_KEYWORDS("collatz problem")
END_PROBLEM()
static int get_chain_length(int start, int64_t &max_number)
{
int length = 1;
for (int64_t n = start; n > 1; length++)
{
if ((n & 1) != 0)
{
n = 3 * n + 1;
}
else
{
n >>= 1;
}
if (n > max_number)
{
max_number = n;
}
}
return length;
}
static void solve_problem_14()
{
bool verbose = false;
int64_t max_number = 0;
int x = 1, xlen = 1;
for (int i = 2; i < 1000000; i++)
{
int len = get_chain_length(i, max_number);
if (len > xlen)
{
x = i;
xlen = len;
}
}
std::cout << x << std::endl;
if (verbose)
{
std::cout << "Max length: " << xlen << std::endl;
std::cout << "Max number: " << max_number << std::endl;
}
}