私はC でProject Euler #14に取り組んでおり、基本的なアルゴリズムを理解しました。ただし、必要に応じて 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;
}