【问题标题】:Project Euler 2 in JavaJava中的Euler 2项目
【发布时间】:2020-07-23 12:49:44
【问题描述】:
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。

【问题讨论】:

  • 您是否正在尝试编写某种既定的数学公式?如果有,请说明它是什么。否则,请清楚地解释您的程序应该做什么。
  • 斐波那契数列中的每个新项都是通过将前两项相加生成的。从 1 和 2 开始,前 10 项将是:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 通过考虑斐波那契数列中其值不超过四百万,求偶数项之和。这就是我要在代码中显示的内容。
  • 老兄,欧拉项目的重点是自己解决问题。当您在下班后获得一份工作时,这是非常有益的(他们变得更加困难)。解决后在论坛中看到人们的解决方案也很酷。请注意,项目 euler 要求人们不要分享如何在线解决特定问题,因为它可以为每个人带来乐趣(projecteuler.com/about 一旦你登录)。快乐编程!
  • 对不起,我真的没有试图获得免费答案,只是对我错在哪里的一点见解,他的提示帮助了我很多,一旦我得到,我不会透露真正的答案它。
  • 你试过用调试器遍历你的代码吗?

标签: java


【解决方案1】:
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

【讨论】:

  • 这不需要num2++; 来增加值吗?当没有num2++; 运行时,它给了我257114。如果我用num2++ 运行它,它会给我574906。在这两种情况下,我都没有收到4613732。如果我错了,请纠正我..
  • 为什么要增加 num2?尝试运行代码,返回正确结果,4613732。
【解决方案2】:

另一种解决方案,使用:

  • 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);
    }
    

【讨论】:

    【解决方案3】:
    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;
            }
        }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 当我在 if 语句之后声明它时,我最终得到 4052018
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          这可能对你有帮助...

          #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;
          }
          

          【讨论】:

            【解决方案8】:
            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
                }
            }
            

            【讨论】:

              【解决方案9】:

              斯威夫特 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
              

              【讨论】:

                【解决方案10】:

                这应该可行:

                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;
                    }
                }
                

                【讨论】:

                【解决方案11】:

                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

                【讨论】:

                  猜你喜欢
                  • 2023-03-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-10
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多