Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 偶斐波那契和_Java - Fatal编程技术网

Java 偶斐波那契和

Java 偶斐波那契和,java,Java,我不知道为什么我的代码在将4000000放入方法的参数大小(即fib4000000)时会产生错误的负值 问题是: 斐波那契序列中的每个新项都是通过将前两项相加生成的。从1和2开始,前10个术语将是: 1、2、3、5、8、13、21、34、55、89 通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和 我的第一个代码: public void fib(int k) { int result = 0; int[] array = new int[k]; a

我不知道为什么我的代码在将4000000放入方法的参数大小(即fib4000000)时会产生错误的负值

问题是:

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

1、2、3、5、8、13、21、34、55、89

通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和

我的第一个代码:

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);
}
有效。

根据:

默认情况下,int数据类型是32位有符号2的补码 整数,最小值为-2^31,最大值为 2^31-1

您将总和存储在结果中,它是一个整数,它将溢出。使用以下长时间重新安装,它将工作:

public static void fib(int size) {

        long result = 0;
        int[] array = new int[size];
        array[0] = 1;
        array[1] = 2;

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

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

fib4000000的值现在是2111290219918。带符号的long的最小值为-2^63,最大值为2^63-1。

我认为您没有遇到溢出问题。我认为你对这个问题的理解有点错误。它说,你应该看看所有斐波那契数的值可能溢出。尝试使用长而不是谷歌的答案,因为这是一个不同的问题和场景。在这个解决方案中,你用Fibonacci求和的数值小于400万,这会更小,但在你原来的解决方案中,你先加上400万Fibonacu,这会更大。在发布答案之前,我在IntelliJ中尝试过这个方法:我的游戏是211129219918,但答案是4613732。然后你可能需要检查逻辑,你说得对!Fml,我花了三个小时想弄清楚到底出了什么问题。哈哈,非常感谢!
    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);
public static void fib(int size) {

        long result = 0;
        int[] array = new int[size];
        array[0] = 1;
        array[1] = 2;

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

        for (int even: array) {
            if (even % 2 == 0) {
                result += even;
            }
        }
        System.out.println(result);
    }
while (i < k) {
while (term1 < k) {