Как исправить мой код последовательности Коллатца, который превышает правило 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)
Другие вопросы по тегам