我不确定为什么当我将4000000放入方法的参数大小时,我的代码会产生错误的负值,即fib(4000000)?

问题问:


  斐波那契数列中的每个新项都是通过将前两个项相加而生成的。从1和2开始,前10个项将是:
  
  1,2,3,5,8,13,21,34,55,89,...
  
  通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和。


我的第一个代码:

public void fib(int k) {

    int result = 0;
    int[] array = new int[k];
    array[0] = 1;
    array[1] = 2;

    for (int i = 2; i < k; i++) {
        array[i] = array[i - 2] + array[i - 1];
    }

    for (int even: array) {

        if (even % 2 == 0) {
            result += even;
        }
    }
    System.out.println(result);
}


哪个没有用,所以我认为是因为数组太大(400万很多),所以我尝试编写不同的代码:

public void fib(int k) {

    int sum = 0;
    int term1 = 1;
    int term2 = 2;
    int term3 = 0;
    int i = 2;

    while (i < k) {

        term3 = term1 + term2;

        term1 = term2;
        term2 = term3;
        i++;

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

    System.out.println(sum + 2);

}


这也没有用。

我的代码有什么问题?对于少量的size,它起作用,但对于较大的,它不起作用。

在我搜索问题的答案后,我发现:

    int term1 = 1;
    int term2 = 2;
    int i = 0;
    int result = 0;

    while (term1 < 4000000) {
        i = term1;
        term1 = term2;
        term2 = term2 + i;

        if (term2 % 2 == 0) {
            result += term2;
        }
    }
    System.out.println(result);


哪个有效。

最佳答案

我认为您没有遇到溢出问题。我认为您在错误地阅读问题。它说您应该查看所有斐波那契数字,其中数字的值小于等于4百万。相反,您正在查看前400万斐波那契数字。两者之间的区别在于:


  1、2、3、5、8(所有纤维数均小于10)


和这个:


  1、2、3、5、8、13、21、34、55、89(前10个Fib编号)


我认为它需要前者,但您正在做后者。

而不是做:

while (i < k) {


如果您这样做怎么办?

while (term1 < k) {

关于java - 甚至斐波那契的总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30229035/

10-12 02:43