Я работаю над Project Euler # 14 на C и выяснил базовый алгоритм; однако он работает невыносимо медленно для больших чисел, например 2 000 000 по желанию; Я предполагаю, потому что он должен генерировать последовательность снова и снова, даже если должен быть способ сохранить известные последовательности (например, как только мы дойдем до 16, мы знаем из предыдущего опыта, что следующие числа - 8, 4, 2 , то 1).
Я не совсем уверен, как это сделать с массивом фиксированной длины C, но должен быть хороший способ (я уверен, что он потрясающе эффективен). Заранее спасибо.
Вот то, что у меня есть, если это поможет.
#include <stdio.h>
#define UPTO 2000000
int collatzlen(int n);
int main(){
int i, l=-1, li=-1, c=0;
for(i=1; i<=UPTO; i++){
if( (c=collatzlen(i)) > l) l=c, li=i;
}
printf("Greatest length:\t\t%7d\nGreatest starting point:\t%7d\n", l, li);
return 1;
}
/* n != 0 */
int collatzlen(int n){
int len = 0;
while(n>1) n = (n%2==0 ? n/2 : 3*n+1), len+=1;
return len;
}