Задача состоит в том, чтобы найти число i <= n, n <= 500000, для которого существует самый длинный ряд Коллатца. Ряд Коллатца для числа n оканчивается на 1, и условия таковы, если n четное, следующий член = n / 2, если n нечетный, следующий член = 3 * n + 1 </p>
Ну, по сути ряд коллатца всегда заканчивается на 1 для всех чисел.
Следовательно, любое число не повторяется в его серии коллатца. Используя этот факт, я написал следующий код LOGI C: я запускаю некоторое время l oop, которое продолжается до n, и для каждой итерации я сохраняю длину ряда для этого i. Если i встречается в ряду некоторого n> = r> i, то i завершает l oop и добавляет длину i к r. Например, скажем, серия 3 равна 3, 10, 5, 16, 8, 4, 2, 1. Теперь длина, соответствующая 2, уже будет сохранена в массиве series_length, поэтому я использую это значение.
Затем для l oop рядом с этим находит самую длинную серию и отображает ответ.
Код работает нормально при n <= 1818, если быть точным, но показывает ошибку сегментации и далее (не знаю почему :( Пожалуйста, помогите </p>
КОД:
#include <stdio.h>
int length = 0, series_length[500000], maxlength = 0;
void store_length(int n) {
while(n > 1 && series_length[n] == 0) {
length++;
if(n%2 == 0) {
n = n/2;
}
else {
n = 3*n + 1;
}
}
length += series_length[n];
}
int main() {
int n, i = 1, result;
scanf("%d", &n);
series_length[1] = 1;//redundant statement
while(i <= n) {
store_length(i);
series_length[i] = length;
length = 0;
i++;
}
for(int i = 1;i <= n; i++) {
if(maxlength <= series_length[i]) {
maxlength = series_length[i];
result = i;
}
}
printf("%d %d\n", result, maxlength);
return 0;
}
ВХОД - 10 ВЫХОД - 9 20 (как ожидается)
ВХОД - 100000 ВЫХОД - Ожидается ошибка сегментации - 77031 351