3
public class Euler2 {
    public static void main(String[] args) {
        int Num1 = 0;
        int Num2 = 1;
        int sum = 0;

        do
        {
            sum = Num1 + Num2;
            Num1 = Num2;
            Num2 = sum;

            if (Num2 % 2 == 0)
                sum = sum + Num2;
        }
        while (Num2 < 4000000);

        System.out.println(sum);
    }
}

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

我不觉得我编码错了,但我得到的答案是 5702887,我知道它应该是 4613732。

4

11 回答 11

6
public class Euler {
   public static void main(String[] args) {    
    int num1 = 0;
    int num2 = 1;
    int temp = 0;
    int sum = 0;

    do {
        if (num2 % 2 == 0) {
            sum = sum + num2;
        }
        temp = num1 + num2;
        num1 = num2;
        num2 = temp;
    } while (num2 < 4000000);

    System.out.println(sum);
  }
}

您在 num2 为偶数的每次迭代中将其分配两次,从而弄乱了总和。在这个解决方案中,我们使用一个临时变量来存储下一个斐波那契数。

解决方案= 4613732

于 2013-09-21T02:06:47.013 回答
1

另一种解决方案,使用:

  • while代替do-while
  • bits操作而不是%
  • 只有 2 个变量来保持有效值(否aux):

    public static void main(String[] args) {
        int sum = 0 ;
        int x1 = 1;
        int x2 = 2;
        while ( x1 < 4000000 ) {
            if ( (x1 & 1) == 0 ){    // x % 2 == 0
                sum += x1;
            }
            x2=x1+x2;                // x2 = sum
            x1=x2-x1;                // x1 = the old value of x2
        }
        System.out.println(sum);
    }
    
于 2014-11-09T18:58:34.257 回答
1
public void execute() {
        int total = 1;
        int toBeAdded = 1;
        int limit = 4000000;
        int totalSum = 0;
        int temp = 0;
        while (total <= limit) {
            if (total % 2 == 0) {
                totalSum = totalSum + total;
            }
            temp = toBeAdded;
            toBeAdded = total;
            total = toBeAdded + temp;
        }
    }
于 2016-06-07T10:38:58.393 回答
0

我不确定程序应该做什么,但部分问题可能是您在 if 语句之前将 num2 分配给 sum 的值,使 if 语句的内部等于 sum = sum + sum;

另一方面,将局部变量的名称大写是不好的做法。祝你好运!

于 2013-09-21T00:51:40.207 回答
0

这里有一些提示(并不是一个完整的答案,因为这似乎是家庭作业):

  • 在计算斐波那契时,您需要提供前两项作为 1 和 2,而不是像现在这样提供 0 和 1。
  • if (Num2 % 2 == 0)正如user2573153指出的那样,这意味着sum每次都翻倍的价值Num2是偶数。但这不是斐波那契的工作方式。if我可以看到您正在尝试使用该语句不断总结偶数项。那么你怎么能做到这一点而不搞砸sum呢?(提示:将偶数存储在其他地方)。
于 2013-09-21T01:04:04.710 回答
0

我刚刚做到了,我只能告诉你你需要一个 if(... % 2 == 0){} 并且只对偶数求和....我希望它对你有帮助。

于 2013-12-22T09:14:07.260 回答
0

这可能会帮助你...

#include<stdio.h>
int  main()
{
    int i,a = 0,b = 1,temp = 0,sum = 0;
    while(temp < 4000000)
    {
        temp = a + b;
        printf("%d\n",temp);
        a = b;
        b = temp;
        if(temp % 2 == 0)
        {
            sum = sum + temp;
        }
    }
    printf("The sum is :- %d\n", sum);
    return 0;
}
于 2017-03-03T13:54:38.887 回答
0
public class FibonacciUpto4Million {
    public static void main(String[] args) {
        int a=1, b=2;
        int sum = 0;
        while(b <= 4000000) {
            //swap two variables
            a = a+b;
            b = a-b;
            a = a-b;

            if(a%2 == 0) {
                sum = sum + a;
            }

            //make b = a+b;
            b = a+b;
        }
        if(b % 2 == 0 && b <= 30) {
            sum = sum + b;
        }
        System.out.println(sum); //4613732
    }
}
于 2020-07-23T04:49:44.997 回答
-1

斯威夫特 3:

func evenFibonacciNumbersSum() -> Int {

    // init first two Fibonacci numbers
    // init sum is 2 (counting only even numbers)
    var result = 2
    var firstFibonacci = 1
    var secondFibonacci = 2

    while true  {

        // new (next) number is a sum of two previous numbers 
        let nextFibonacci = firstFibonacci + secondFibonacci

        // check if new Fib number is even
        if nextFibonacci % 2 == 0 {
            // if even - add to result
            result += nextFibonacci
        }

        // if new Fib number hit 4M - no more calculations
        if nextFibonacci > 4000000 {
            return result
        }

        // to move on we need to reassign values
        firstFibonacci = secondFibonacci
        secondFibonacci = nextFibonacci
    }
}

print(evenFibonacciNumbersSum()) // will print 4613732
于 2016-11-30T03:06:29.873 回答
-1

这应该有效:

public static void main(String[] args)
{
    int n1=0;
    int n2=1; 
    int n3=0; 
    int count=10000; 
    int limit=4000000; 
    int sum=0;
    for(int i=1;(i<=count && n3<=limit); i++)
    {
        n3=n1+n2;
        if(n3%2==0){
            sum = sum+n3;
            System.out.println(sum);
        }
        n1=n2;
        n2=n3;
    }
}
于 2017-02-26T07:31:30.340 回答
-2

JavaScript

function printSumOfEvenFiboNumbersWithin (limit) {
    var current = 2, prev = 1, next, sum = 0;
    do {
        next = current + prev;
        prev = current;
        current = next;
        sum += prev % 2 == 0 ? prev : 0;
    } while (prev < limit);

    console.log(sum);
}

printSumOfEvenFiboNumbersWithin(4000000); // 4613732

于 2014-10-15T11:43:48.607 回答