我正在用 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;
}