Java 第二号工程

Java 第二号工程,java,Java,我尝试了很多次,但我似乎不知道自己做错了什么。这是我最近试图解决的问题之一 我从其他渠道知道正确答案是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,

我尝试了很多次,但我似乎不知道自己做错了什么。这是我最近试图解决的问题之一

我从其他渠道知道正确答案是
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);        
    }
}
/*
*问题2
*斐波那契序列中的每个新项都是通过将前两项相加生成的。
*从1和2开始,前10个术语将是:
*
* 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
*
*通过考虑Fibonacci序列中值不超过4的项
*百万,求偶数值项之和。
*/
公共类问题2
{
公共静态void main(字符串参数[])
{
整数和=0;
int[]anArray=新int[4000000];
anArray[0]=1;
anArray[1]=2;

对于(int i=2;i
for(int i=2;i
for(int i=2;i我认为逻辑是正确的,但这是一种低效的方法。Project Euler旨在让您找出更好的算法,因此您的原始算法很可能已经耗尽了时间或内存

尝试在斐波那契数中寻找模式,以找到更快的方法


编辑:我没有注意到你在达到4000000之后没有跳出循环。在这种情况下,数字将溢出并给出不正确的结果。你需要在数字超过4000000之后跳出循环。而且,这个巨大的数组完全没有必要,因为你只需要最后两个数字来计算每个新的数字。

逻辑看起来很复杂请纠正我的错误,但是这是一种低效的方法。Project Euler旨在让您找出更好的算法,因此您的原始算法可能会耗尽时间或内存

尝试在斐波那契数中寻找模式,以找到更快的方法


编辑:我没有注意到你在达到4000000之后没有跳出循环。在这种情况下,数字将溢出并给出不正确的结果。你需要在数字超过4000000之后跳出循环。而且,这个巨大的数组完全没有必要,因为你只需要最后两个数字来计算每个新的数字。

你超过了一个
int
的精度。你计算的数字太多了,最终得到的是负数。请将数组的大小设置为正常值(如40),或者在if语句中进行检查以忽略负数

实际上,只需将数组的大小更改为40,因为int翻转之后的任何内容都是错误的

int [] anArray = new int[40];
还要注意,您没有添加数组中的第二个数字
2


当你的数字超过4000000时,你也可以打破for循环,因为你根本不在乎它们。

你已经超过了
int
的精度。你计算的数字太多了,最终得到的是负数。让数组的大小合理一些(比如40),或在if语句中进行检查以忽略负数

实际上,只需将数组的大小更改为40,因为int翻转之后的任何内容都是错误的

int [] anArray = new int[40];
还要注意,您没有添加数组中的第二个数字
2


当你的数字超过4000000时,你也可以打破for循环,因为你根本不在乎它们。

首先,你错过了这两个
其次,为了避免溢出问题:,您应该在超过一百万时插入break语句。

首先,您缺少这两个语句
第二,为了避免溢出问题:,当它超过一百万时,您应该插入一个break语句。

使用数组而不是编写一些求和公式使得问题的解决非常普通。您可以简单地使用等于算术运算符,巧妙地避免使用数组。 我的代码解决方案是这样的。希望对您有所帮助

       /*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());
               }
  }
/*项目euler问题2*/
/*fibonacci序列中偶项之和*/
公共类Euler2
{
静态长纤维()
{
长和=0;
长initialint=0;
长secondint=1;
长fibo=初始整数+第二整数;

而(fibo使用数组而不是编写求和的公式使得问题的解决非常普通。您可以简单地使用等于算术运算符,巧妙地避免使用数组。 我的代码解决方案是这样的。希望对您有所帮助

       /*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());
               }
  }
/*项目euler问题2*/
/*fibonacci序列中偶项之和*/
公共类Euler2
{
静态长纤维()
{
长和=0;
长initialint=0;
长secondint=1;
长fibo=初始整数+第二整数;

而(fibo如果观察斐波那契序列,则每三个数字是偶数:

1,1,2,3,5,8,13,21,34

所以一个长度为3的数组就足够了。我们可以生成接下来的3个fibonacci数并将其存储(覆盖)在数组中,数组中所有第三个元素(偶数fib数)的和将给出fibonacci序列中所有偶数的和

代码:

}


附言:这个答案可能并不完全回答OP的问题,但出于找到它的喜悦,希望能与大家分享这项技术。希望它能帮助其他来到这里寻找解决方案的人。

如果你观察斐波那契序列,每三分之一的数字都是偶数:

1,1,2,3,5,8,13,21,34

所以一个长度为3的数组就足够了。我们可以生成接下来的3个fibonacci数并将其存储(覆盖)在数组中,数组中所有第三个元素(偶数fib数)的和将给出fibonacci序列中所有偶数的和

代码:

}

附言:这个答案可能并不能完全回答OP的问题,但我想分享一下OP的技巧
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);
}