项目Euler 14(Collat​​z猜想),在Java中实现缓存

时间:2014-01-12 17:13:58

标签: java caching collatz

我正在解决项目欧拉问题而且我被困在第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个术语。虽然尚未证实(Collat​​z问题),但据认为所有起始数字都以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);


}
}

但它不起作用,我在哪里错了?是因为长期转型?

1 个答案:

答案 0 :(得分:1)

在这一行:

counter=collatzCache[(int) number];

你用缓存值覆盖计数器中的内容,因此会丢失额外的链式步骤。