我正在解决项目欧拉问题而且我被困在第14位,我确实设法使用蛮力来解决它,问题表明: http://projecteuler.net/problem=14
为正整数集定义了以下迭代序列:
n → n/2 (n is even) n → 3n + 1 (n is odd)
使用上面的规则并从13开始,我们生成以下序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出,该序列(从13开始,在1结束)包含10个术语。虽然尚未证实(Collatz问题),但据认为所有起始数字都以1结束。
哪个起始编号低于一百万,产生最长的链?
注意:一旦链条启动,条款允许超过一百万。
我想要做的是实现缓存,我想使用整数数组作为缓存,索引将是数字,每个单元格中存储的计数将是链的长度,当我们点击时缓存单元已经具有正数的数字我们跳过进一步检查(打破循环),从循环中获取现有的计数器数据并将其添加到当前计数器值,并从下一个数字开始,所以这里'实施:
由于Project Euler政策而删除了工作强力代码,下面是错误代码。
public class Challenge14 {
public static void main(String[] args) {
int[] collatzCache=new int[1000000]; //cache
int count=0;
long maxCount=0;
int maxNumber=0;
long number;
int limit=1000000;
for(int i=0;i<limit;i++)
{
int counter=0;
number=i;
while(number>1)
{
if(number%2==0)
{
number=number/2;
}
else
{
number=3*number+1;
}
if(number<limit && collatzCache[(int)number]>0) //check
{
counter=collatzCache[(int) number];
break;
}
counter++;
}
count=counter+1;
collatzCache[i]=count;
if(count>maxCount)
{
maxCount=count;
maxNumber=i;
}
}
System.out.println(maxNumber);
}
}
但它不起作用,我在哪里错了?是因为长期转型?
答案 0 :(得分:1)
在这一行:
counter=collatzCache[(int) number];
你用缓存值覆盖计数器中的内容,因此会丢失额外的链式步骤。