2012-01-19 90 views
5

我试图解决Euler's Project #2,我一直以“Infinity”或“NaN”(不是数字)的方式得到答案。我尝试将数字类型更改为int(最初为Double),但这并没有解决任何问题给我的回答“-1833689714”项目欧拉#2无限?

public class Pro { 
    static int g = 1; 
    static int n, f = 0; 
    public static void main(String args[]) { 
     for (int i = 0; i <= 4000000; i++) { 
      f = f + g; 
      g = f - g; 
      if (f % 2 == 0) { 
       n += f; 
      } 
     } 
     System.out.println("Answer: " + n); 
    } 
} 

的问题是:

在Fibonacci序列中的每个新名词是通过将前两个方面产生。通过用1和2开始,第一10项将是:

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

通过考虑中的条款斐波纳契数列的值不超过四百万,找到偶数项的和。

+0

你也可能要检查BigInteger类:http://docs.oracle.com/javase/6/docs/ api/java/math/BigInteger.html – santiagozky

回答

8

你正在考虑斐波那契序列而不是第一x条款不超过4,000,000第4000000项。

+0

谢谢,我还在醒来;)现在明白了 – M4trixSh4d0w

2

您可能遇到溢出。 fibo(4000000)远高于MAX_INT

注:,你不会被要求找到总和4,000,000第一号连号,但要找到的元素,他们的不超过4,000,000的总和。

您应该检查是否f< 4000000如果没有,打破,而不是等待i达到400万

1

您正在检查第一个400万斐波纳契,您只需检查术语,直到fibonnaci术语大于400万,然后停止。你得到负数的原因是,你最终得到的是大于Integer.MAX_INT的斐波那契条款,在这一点你溢出,并开始获得负数,你正在增加你的总数。如果你不肯定最终答案是否会超过Integer.MAX_INT,那么你应该使用长整型作为累加器而不是整型。

0

使用GMP来处理C中的大数字。 之前的一点思考也不会伤害(例如,奇数与偶数的频率是多少,斐波那契数列的前n个元素的总和是多少) ...

+1

这不是'C',java有它的原生'BigInteger'类。另外,对于这个问题,“长”已经足够了。 – amit

+0

我对C部分的不好... – Matthieu

+0

使用'long'可能绰绰有余,但'BigInteger'是高精度计算的首选:http://docs.oracle.com/javase/tutorial/java/data /numberclasses.html –

3

您的问题是整数溢出:在Java中,int变量仅限于Integer.MAX_VALUE(2147483647)。如果在计算中超过此值,则会溢出至Integer.MIN_VALUE,最小值为,负值为。请参阅:

public class IntegerOverflow { 
    public static void main(String[] args) { 
     int i = Integer.MAX_VALUE; 
     System.out.println("i = Integer.MAX_VALUE: " + i); 
     System.out.println("i + 1: " + (i + 1)); 
     System.out.println("i + 2: " + (i + 2)); 
    } 
} 

要避免溢出问题,与任意精度的整数执行你的计算,由java.math.BigInteger类提供:

import java.math.BigInteger; 

public class BigIntegerExample { 
    public static void main(String[] args) { 
     BigInteger b = BigInteger.valueOf(Long.MAX_VALUE); 
     System.out.println("b = Long.MAX_VALUE: " + b); 
     System.out.println("b**2: " + b.multiply(b)); 
     System.out.println("b**3: " + b.pow(3)); 
     System.out.println("b**10: " + b.pow(10)); 
    } 
} 

注意:当你没有问为了解决问题本身,我只是回答这个问题。希望这可以帮助

+1

这个问题应该只需要一个'int'。 – Jeffrey

+0

你是对的,但是:在这个问题中使用'BigInteger'的性能损失可以忽略不计,并且使用'BigInteger'你不必担心溢出。 –

+0

+1用于回答与笔记的问题,并保持PE帮助的精神。 –

0

您可以使用long而不是int

每第三个表达式都是偶数,所以您只需要评估每个第三个值。这个速度稍微快一些,因为它循环次数少,你不必测试偶数/奇数。

您只需要n而不是i这是不到400万。

0

这是我得到了答案:

def fib(): 
     x,y = 0,1 
     while True: 
      yield x 
      x,y = y, x+y 

def even(seq): 
    for number in seq: 
     if not number % 2: 
      yield number 

def under_a_million(seq): 
    for number in seq: 
     if number > 4000000: 
      break 
     yield number 

print sum(even(under_a_million(fib()))) 

-M1K3