2011-05-16 73 views
1

我是一个相对较新的java程序员,我一直在修改这个程序的一天中的更好的一部分,我仍然卡住;我希望你能帮助我。项目欧拉,问题2 - Java

所以程序应该满足以下要求:

在Fibonacci序列 每个新学期是通过添加 前两个方面产生。通过用1和 2开始时,第一10项将是:

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

通过考虑术语在 斐波那契数列的值不是 超过四百万,求出偶数值的总和 。

这是我的代码:

//Generates Fibonacci sequence 
    while (fibNum < 144) 
    { 
     int lastValue = (Integer) fibList.get(fibList.size()-1); 
     int secondToLastValue = (Integer) fibList.get(fibList.size()-2); 

     fibNum = secondToLastValue + lastValue; 

     if (fibNum < 144) 
     { 
      fibList.add(fibNum); 
     } 

    //Picks out the even numbers from limitFibList 
    for (int i = 0; i < fibList.size(); i++) 
    { 
     if ((Integer) fibList.get(i) % 2 == 0) 
     { 
      evenNumsFibList.add(fibList.get(i)); 
     } 
    } 

    //Sums up the total value of the numbers in the evenNumsFibList 
    for (int i = 0; i < evenNumsFibList.size(); i++) 
    { 
     sum += (Integer) evenNumsFibList.get(i); 
    } 

...这是我得到的输出:

Fibonacci sequence list: [1, 2, 3] 
Size of the Fibonacci list: 3 
Even Numbers list: [2] 
Total sum of even numbers: 2 

Fibonacci sequence list: [1, 2, 3, 5] 
Size of the Fibonacci list: 4 
Even Numbers list: [2, 2] 
Total sum of even numbers: 6 

Fibonacci sequence list: [1, 2, 3, 5, 8] 
Size of the Fibonacci list: 5 
Even Numbers list: [2, 2, 2, 8] 
Total sum of even numbers: 20 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13] 
Size of the Fibonacci list: 6 
Even Numbers list: [2, 2, 2, 8, 2, 8] 
Total sum of even numbers: 44 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21] 
Size of the Fibonacci list: 7 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8] 
Total sum of even numbers: 78 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34] 
Size of the Fibonacci list: 8 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34] 
Total sum of even numbers: 156 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55] 
Size of the Fibonacci list: 9 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 278 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
Size of the Fibonacci list: 10 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 444 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
Size of the Fibonacci list: 10 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 654 

显然,我的while循环有助于我的问题,但我不知道如何解决它。

将非常感谢您的帮助,

哈克

回答

5

看起来你缺少的while循环结束括号。所以其他的for都在其中运行。

所以:

while (fibNum < 144) 
    { 
     int lastValue = (Integer) fibList.get(fibList.size()-1); 
     int secondToLastValue = (Integer) fibList.get(fibList.size()-2); 

     fibNum = secondToLastValue + lastValue; 

     if (fibNum < 144) 
     { 
      fibList.add(fibNum); 
     } 
    } 

    //Picks out the even numbers from limitFibList 
    for (int i = 0; i < fibList.size(); i++) 
    {... 
+0

这是大括号。谢谢,非常感谢你的帮助 – LTH 2011-05-16 01:17:41

0

的问题是在这里:

for (int i = 0; i < fibList.size(); i++) 
{ 
    if ((Integer) fibList.get(i) % 2 == 0) 
    { 
     evenNumsFibList.add(fibList.get(i)); <-- HERE 
    } 
} 

你adppending所有的偶数的一个全新的列表,你已经拥有了列表的末尾。

在再次调用此循环之前,您需要删除evenNumsFibList中的所有内容,或者修改循环以仅添加不在列表中的偶数。

这是假设您的缩进不正确。如果你的缩进实际上是你想要的,那么你只是在你的while循环中丢失了一个右括号。

+0

良好的接触..缩进愚弄我。 – bdares 2011-05-16 00:42:51

+0

感谢您的快速回复,并抓住缺失的支架。大声笑有时候,最小的东西可能会让你失望。 – LTH 2011-05-16 01:18:26

0

我错过了什么吗?你为什么需要创建列表?你只需要一个偶数数值的总和?对?如果我正确理解了你的话,你可以在10行代码中得到你的总和......我没有Java IDE opend,所以我会给你Pythone代码。如果这是你所需要的,我会把它转换成Java。

def fib(n=4000001): # write Fibonacci series up to n 
    r = 0 
    a, b = 0, 1 
    while b < n: 
     if not b%2 : 
      print(b, end=' ') 
      r += b 
     a, b = b, a+b 
    return r 

OUTPUT: 
2 8 34 144 610 2584 10946 46368 196418 832040 3524578 
sum = 4613732 
+0

现在我明白了 - 这是欧拉计划,我错过了那部分... – Nikiton 2011-05-16 19:48:09

8

如果你把在Fibonacci序列中,你实际上需要的(只有甚至是那些需要进行求和)数字仔细看看,你会看到一个模式:

0 1 1 2 3 5 8 13 21 34 55 89 144 ... 
- O O E O O E O O E O O E 

注意在0之后开始的每个第三个数字是偶数。因此,如果您计算每第三个斐波纳契数,您可以消除对均匀度的任何检查。在序列再次看,你可以看到,如果k是你正在寻找本甚至斐波那契数和j是一个上一个,下一个偶数Fibonacci数n获得人:

n = 4k + j 

所以在Java中,你可以尝试这样的事:

int j = 0; 
int k = 2; 
int sum = j+k; 

while (k < LIMIT) { 
    int tmp = 4*k + j; 
    sum = sum + tmp; 
    j = k; 
    k = tmp; 
} 
+0

真棒解决方案。我喜欢这些珠宝。 – KyleWpppd 2011-05-16 04:36:27

+0

真的很好,简洁的解决方案!但是如何找到变量LIMIT的值?我们必须找到Fibonacci序列中所有偶数的总和,其值不超过四百万。请,我请你解释一下逻辑。我希望它与上述一样简洁。 – 2013-01-31 13:54:26

+0

@AshutoshDave'LIMIT'是一个用户定义的常量。假设这个常量被定义并设置为你需要的任何值。鉴于这些值不超过4M,那么'LIMIT'就会成为'int'。 – buruzaemon 2013-01-31 23:42:32

0

公共类Euler002 {

int counter = 0; 

public int getCounter() { 
    return counter; 
} 

public int getFibTotal() { 
    final int UPPER_LIMIT = 4000000; 
    int fib1 = 0; 
    int fib2 = 1; 
    int newFib = fib1 + fib2; 
    int total = 0; 

    while (newFib < UPPER_LIMIT) { 
     counter++; 
     fib1 = fib2; 
     fib2 = newFib; 
     newFib = fib1 + fib2; 
     if ((newFib % 2) == 0) { 
      total += newFib; 
     } 
    } 
    return total; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    Euler002 euler002 = new Euler002(); 
    int total = euler002.getFibTotal(); 
    System.out.println(" Counter = " + euler002.getCounter() + " And Fib Total is " + total); 
} 

}