Как исправить мой код последовательности Коллатца, который превышает правило 1 минуты? - PullRequest
0 голосов
/ 19 февраля 2019

Резюме

Привет всем.Я пытаюсь решить относительно простую проблему, связанную с гипотезой Коллатца.

Прежде всего, проблема звучит следующим образом:

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

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 Ответ

0 голосов
/ 19 февраля 2019

хорошо, если ваша функция возвращает целое число, которое вы на самом деле не решали, только частично, я думаю, что это должно сделать

unsigned long long collatz(unsigned long long n)
...