我对它采取了很多刺,我似乎无法弄清楚我做错了什么。这是我最近尝试解决的问题之一。
我知道其他来源的正确答案是4613732
。
/*
* PROBLEM 2
* Each new term in the Fibonacci sequence is generated by adding the previous two terms.
* By starting with 1 and 2, the first 10 terms will be:
*
* 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
*
* By considering the terms in the Fibonacci sequence whose values do not exceed four
* million, find the sum of the even-valued terms.
*/
public class problem2
{
public static void main(String args[])
{
int sum = 0;
int[] anArray = new int[4000000];
anArray[0] = 1;
anArray[1] = 2;
for (int i = 2; i <= anArray.length - 1; i++) {
anArray[i] = anArray[i - 1] + anArray[i - 2];
if (anArray[i] % 2 == 0 && anArray[i] <= 4000000) {
sum += anArray[i];
}
}
System.out.println(sum);
}
}
答案 0 :(得分:1)
你超过了int
的精确度。你计算的数字太多,最终得到负数。使数组的大小合理(如40),或者检查if语句以忽略负数。
实际上,只需将数组的大小更改为40,因为int翻转后的任何内容都是错误的。
int [] anArray = new int[40];
另请注意,您没有添加2
,即阵列中的第二个数字。
当你的数字超过4,000,000时,你也可以跳出for循环,因为你无论如何都不关心它们。
答案 1 :(得分:1)
首先,你错过了这两个 其次,为了避免溢出问题http://en.wikipedia.org/wiki/Integer_overflow,你应该在超过一百万的时候插入一个break语句。
答案 2 :(得分:0)
for(int i=2;i<=anArray.length-1;i++){
anArray[i]=anArray[i-1]+anArray[i-2];
if(anArray[i]%2==0 && anArray[i]<=4000000){
sum+=anArray[i];
}
}
你应该检查循环中Fibonacci数的极限,而不仅仅是“sum”部分。因为你错过了支票,所以你满溢了。溢出后,数字“包裹”回较小的数字,导致它们(可能,但绝对在这里)小于4000000。
您可以使用BigInteger来避免溢出。它没有很好的性能(至少对于Java 1.6而言),但它可以解决这个问题。
答案 3 :(得分:0)
逻辑对我来说是正确的,但这是一种低效的方法。项目Euler旨在让您找出更好的算法,因此您的天真算法可能会耗尽时间或内存。
尝试寻找斐波那契数字中的模式,以便采用更快的方法。
编辑:我错过了你在达到4000000后没有突破循环。在这种情况下,数字会溢出并给你不正确的结果。你需要在数字超过4000000后中断。此外,这个巨大的数组是完全没必要的,因为你只需要最后两个数字来计算每个新数字。
答案 4 :(得分:0)
使用数组而不是为总和写一些公式使得问题的解决方案非常普通。您可以简单地使用等于算术运算符,巧妙地避免使用数组。 我的代码解决方案是这样的。希望它可以帮到你。
/*PRoject euler problem2*/
/*Sum of even terms in fibonacci sequence*/
public class Euler2
{
static long fibosum()
{
long sum=0;
long initialint=0;
long secondint=1;
long fibo=initialint+secondint;
while(fibo<4000000)
{
if(fibo%2==0)
{
sum=sum+fibo;
}
initialint=secondint;
secondint=fibo;
fibo=initialint+secondint;
}
return sum;
}
public static void main(String args[])
{
Euler2 a=new Euler2();
System.out.println("Sum of even fibonacci numbers below 4000000 is"+a.fibosum());
}
}
答案 5 :(得分:-1)
如果您观察到斐波那契序列,则每三个数字都是偶数:
1,1,的 2 下,3,5,的 8 下,13,21,的 34 强>
所以长度为3的数组就足够了。我们可以生成接下来的3个斐波纳契数并将其存储(覆盖)在数组中,数组中所有第三个元素(偶数为fib数)的总和将给出我们斐波那契数列中所有偶数的总和。
代码:
public class Prob2 {
public static int sumOfEvenFibonacci(int limit){
int fibonacci[] = {1, 1, 2};
int j, sum = 2;
while(fibonacci[2] < limit){
for(j = 0; j < 3; j++){
fibonacci[j] = fibonacci[(j+1)%3] + fibonacci[(j+2)%3];
}
sum += fibonacci[2];
}
return sum - fibonacci[2];
}
}
琐碎的测试案例:
public class TestProb2 {
@Test
public void testSumOfMultiples(){
int actual = Prob2.sumOfEvenFibonacci(15);
assertEquals(10, actual);
actual = Prob2.sumOfEvenFibonacci(50);
assertEquals(44, actual);
actual = Prob2.sumOfEvenFibonacci(200);
assertEquals(188, actual);
actual = Prob2.sumOfEvenFibonacci(4000000);
assertEquals(4613732, actual);
}
}
P.S:这个答案可能并不能完全回答OP的问题,但希望分享这项技术,因为找到它的快乐。希望它可以帮助那些在这里寻找解决方案的人。