官术网_书友最值得收藏!

  • The Modern C++ Challenge
  • Marius Bancila
  • 334字
  • 2021-06-25 22:01:24

12. Largest Collatz sequence

The Collatz conjecture, also known as the Ulam conjecture, Kakutani's problem, the Thwaites conjecture, Hasse's algorithm, or the Syracuse problem, is an unproven conjecture that states that a sequence defined as explained in the following always reaches 1. The series is defined as follows: start with any positive integer n and obtain each new term from the previous one: if the previous term is even, the next term is half the previous term, or else it is 3 times the previous term plus 1.

The problem you are to solve is to generate the Collatz sequence for all positive integers up to one million, determine which of them is the longest, and print its length and the starting number that produced it. Although we could apply brute force to generate the sequence for each number and count the number of terms until reaching 1, a faster solution would be to save the length of all the sequences that have already been generated. When the current term of a sequence that started from a value n becomes smaller than n, then it is a number whose sequence has already been determined, so we could simply fetch its cached length and add it to the current length to determine the length of the sequence started from n. This approach, however, introduces a limit to the Collatz sequences that could be computed, because at some point the cache will exceed the amount of memory the system can allocate:

std::pair<unsigned long long, long> longest_collatz(
unsigned long long const limit)
{
long length = 0;
unsigned long long number = 0;
std::vector<int> cache(limit + 1, 0);

for (unsigned long long i = 2; i <= limit; i++)
{
auto n = i;
long steps = 0;
while (n != 1 && n >= i)
{
if ((n % 2) == 0) n = n / 2;
else n = n * 3 + 1;
steps++;
}
cache[i] = steps + cache[n];

if (cache[i] > length)
{
length = cache[i];
number = i;
      }
}

return std::make_pair(number, length);
}
主站蜘蛛池模板: 张掖市| 会同县| 台中市| 会东县| 贵阳市| 白朗县| 东兰县| 德清县| 深州市| 涿鹿县| 汶川县| 横峰县| 乐业县| 文登市| 抚顺市| 唐海县| 安西县| 旌德县| 孙吴县| 桑日县| 太仓市| 吴堡县| 元氏县| 芦溪县| 兴仁县| 海兴县| 翼城县| 威信县| 建瓯市| 图木舒克市| 河源市| 重庆市| 邯郸市| 湟中县| 满城县| 黎城县| 平山县| 桐城市| 靖宇县| 吴桥县| 巫溪县|