【发布时间】:2014-01-12 17:13:58
【问题描述】:
我正在解决 Project Euler 问题,但我被困在第 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 Problem),但人们认为所有的起始数字都以 1 结束。
100 万以下的哪个起始数字产生最长的链?
注意:一旦链启动,条款允许超过一百万。
我要做的是实现一个缓存,我想使用一个整数数组作为缓存,索引将是数字,存储在每个单元格中的计数将是链的长度,当我们点击一个缓存单元已经有正数的数字我们跳过进一步检查(打破循环),从循环中获取现有的计数器数据并将其添加到当前计数器值,然后从下一个数字开始,所以这里是实现:
由于 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);
}
}
但它不起作用,我在哪里出错了?是不是因为 long to int 类型转换?
【问题讨论】:
-
Project Euler 明确要求人们不要在网上发布解决方案。
-
我将删除工作解决方案,但我确实需要缓存方面的帮助。编辑:抱歉问菜鸟问题,问题的编辑按钮在哪里?
-
对 PE 问题的强力回答,尤其是早期的问题,只需 google 搜索即可。我认为在此处删除您的蛮力解决方案并没有什么好处,但是如果您需要编辑帖子,“编辑”链接位于标签下方,标签位于问题本身下方。
-
我不需要蛮力方面的帮助,凭借现代计算机的处理能力,几乎所有 2005 年之前的问题都可以轻松解决,但我试图找到一个即使在最慢的机器上也能运行的解决方案,不依赖于处理能力或高级库。