Как исправить мой код последовательности Коллатца, который превышает правило 1 минуты?
Резюме
Здравствуйте все. Я пытаюсь решить относительно простую проблему, связанную с гипотезой Коллатца.
Прежде всего, проблема заключается в следующем:
Следующая итерационная последовательность определена для набора натуральных чисел:
n → n / 2 (n четное) n → 3n + 1 (n нечетное)
Используя приведенное выше правило и начиная с 13, мы генерируем следующую последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 Видно, что эта последовательность (начиная с 13 и заканчивая 1) содержит>10 членов. Хотя это еще не доказано (проблема Коллатца), считается, что> все начальные числа заканчиваются на 1.
Какой стартовый номер, менее одного миллиона, дает самую длинную цепочку?
ПРИМЕЧАНИЕ. После запуска цепочки условия могут превышать миллион.
Источник: https://projecteuler.net/problem=14
Короткая сноска
Изначально у меня были проблемы с переполнением и отрицательным значением переменных. Хотя я исправил это, используя unsigned long long, как я уже упоминал.
Код
#include <iostream>
using namespace std;
int collatz(long long n) {
if (n%2 == 0) return n/2;
return 3*n+1;
}
int main() {
unsigned long long cnt, n, maxcnt=0, num;
for(int i=1; i<1000000; i++) {
cnt=1;
n=i;
while(n != 1) {
n=collatz(n);
cnt++;
}
if(cnt>maxcnt) {
maxcnt=cnt;
num=i;
}
}
cout<<num;
return 0;
}
Результат
Вместо того, чтобы получить какой-либо результат, он просто заканчивается бесконечным циклом.
1 ответ
Хорошо , если ваша функция возвращает int, вы на самом деле не решили проблему только частично, я полагаю, это должно сделать
unsigned long long collatz(unsigned long long n)