Code: Select all
#include <iostream>
#include <vector>
using namespace std;
const int MAX_DIS = 1000000;
int already_found[MAX_DIS] = {0};
int Ackermann_3n(unsigned long long number)
{
vector<unsigned long long> seq;
int steps = 0;
if (number == 1)
{
number = number * 3 + 1;
steps++;
}
while (number != 1)
{
if (number < MAX_DIS)
if (already_found[number])
{
steps += already_found[number];
break;
}
seq.push_back(number);
if (number % 2 == 0) number /= 2;
else number = number * 3 + 1;
steps++;
}
for (int a = 0; a < seq.size(); a++)
if (seq[a] < MAX_DIS)
already_found[seq[a]] = steps - a;
return steps;
}
int main()
{
unsigned long long first, second, lower, upper;
while (cin >> first >> second)
{
if (first == 0 && second == 0) return 0;
lower = first <? second;
upper = first >? second;
unsigned long long max = 0, number = lower, result = 0;
for (unsigned long long a = lower; a <= upper; a++)
{
result = Ackermann_3n(a);
if (result > max)
{
max = result;
number = a;
}
}
cout << "Between " << lower << " and " << upper << ", " << number << " generates the longest sequence of " << max << " values.\n";
}
return 0;
}
Code: Select all
2147483647 2147483647
1 20
35 55
1 1
20 1
1000001 1200000
1000000 1000000
2000000 2000000
4000000 4000000
2147483647 2147483647
16 16
1 2
58 58
19 19
1 3
1 2
2 2
1 2
1 10000
30000 100000
1 1000000
42 18
35 1
20 25
29 9
13 15
6 46
32 28
12 42
46 43
28 37
42 5
3 4
43 33
22 17
19 46
48 27
22 39
20 13
18 50
36 45
0 0