Самая длинная последовательность Коллатца — Prokect Euler # 14

Следующая итерационная последовательность определена для набора натуральных чисел:

n → n / 2 (четное n)
n → 3n + 1 (n нечетно)

Используя приведенное выше правило и начиная с 13, мы генерируем следующую последовательность:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Можно видеть, что эта последовательность (начиная с 13 и заканчивая 1) содержит 10 членов. Хотя это еще не доказано (проблема Коллатца), считается, что все стартовые числа заканчиваются на 1.

Какой стартовый номер, менее одного миллиона, дает самую длинную цепочку?

ПРИМЕЧАНИЕ. После запуска цепочки условия могут превышать миллион.

Это задача, и это мое решение:

     #include <iostream>
using namespace std;

int n;
int start_n;
bool n_even = false;
int sequence_length = 0;
int longest_sequence = 0;
int longest_sequence_number;

int main()
{
for (n = 2; n <= 1000000; n++)
{
start_n = n;

cout << n << endl;

do
{
sequence_length += 1;
if (n % 2 == 0)
{
n_even = true;
}
else
{
n_even = false;
}

if (n_even == true)
{
n = n / 2;
}
else
{
n = 3 * n + 1;
}
} while (n == 1);

if (sequence_length > longest_sequence)
{
longest_sequence = sequence_length;
longest_sequence_number = start_n;
sequence_length = 0;
}
else
{
sequence_length = 0;
}
}

cout << "Number with the longest sequence: " << longest_sequence_number << endl;

int end;
cin >> end;

}

Я проверил как оценку последовательности, так и генерацию n независимо, и обе работы. Тем не менее, когда я соединяю их вместе, пол цикла создает 2, 5, 17, 53, 161, 485, 1457, 4373, 13121, 39365, 118097, 354293 и говорит, что число с самой длинной последовательностью равно 2.

Есть проблема с моим циклом for, циклом while или обоими?

-2

Решение

В вашем коде есть как минимум 2 проблемы, которые я могу сразу заметить:

  • Внутри вашего «поколения-последовательности» вы меняете n, который вы также используете в качестве счетчика в цикле for. Не делайте этого, лучше измените цикл for на start_n и используйте n для последовательности или наоборот.
  • Ваша последовательность продолжается while(n==1) — не должно быть while(n!=1) ?
1

Другие решения

Других решений пока нет …