2012-01-19 13 views
5

Estoy tratando de resolver Euler's Project #2 y sigo obteniendo la respuesta como "Infinity" o "NaN" (No es un número) Intenté cambiar el tipo de número a int (originalmente Double), pero eso no solucionó nada solo me dio la respuesta "-1833689714"Proyecto Euler # 2 Infinity?

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

las preguntas es:

Cada nuevo término de la sucesión de Fibonacci se genera mediante la adición de los dos términos anteriores. Al comenzar con 1 y 2, los 10 primeros términos serán:

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

Al tener en cuenta los términos en la secuencia de Fibonacci cuyos valores no exceden los cuatro millones, encuentra la suma de los términos pares.

+0

es posible que también desee comprobar la clase BigInteger: http://docs.oracle.com/javase/6/docs/ api/java/math/BigInteger.html – santiagozky

Respuesta

8

Usted está considerando las primeras 4.000.000 términos de la sucesión de Fibonacci en lugar de los primeros x términos que no excedan de 4.000.000.

+0

Gracias, todavía estaba despertando;) Lo tengo ahora – M4trixSh4d0w

2

Probablemente se encuentre con un desbordamiento. fibo(4000000) es muy por encima de MAX_INT.

Nota: que no se le pide encontrar la suma de números pares en los primeros números 4.000.000, sino para encontrar la suma de los elementos que incluso su valor no ha terminado 4.000.000.

debería comprobar si f< 4000000 y si no, desintegración, y no esperar a llegar a 4.000.000 i

1

Está comprobando los primeros 4 millones de fibonacci, solo necesita verificar los términos hasta que un término fibonnaci sea mayor a 4 millones y luego detenerse. La razón por la que obtiene números negativos es que finalmente obtiene términos de Fibonacci que son mayores que Integer.MAX_INT, en cuyo punto se desborda y comienza a obtener números negativos, que está agregando a su total. Si no está seguro de si la respuesta eventual va a exceder Integer.MAX_INT, debería utilizar un largo como su acumulador en lugar de un int.

0

Uso GMP para manejar grandes números en C. Y un poco antes de pensar no duele tanto (como la frecuencia con la que hay es un número impar, incluso frente, lo que es la suma de los primeros n elementos de secuencia de Fibonacci) ...

+1

Esto no es 'C', java tiene su clase nativa' BigInteger'. Además, para esta pregunta 'long' es más que suficiente. – amit

+0

Me duele la parte C ... – Matthieu

+0

Usar 'long' puede ser más que suficiente, pero' BigInteger' es preferido para cálculos de alta precisión: http://docs.oracle.com/javase/tutorial/java/data /numberclasses.html –

3

Su problema es un desbordamiento de entero: en Java, una variable int está limitada a Integer.MAX_VALUE (2147483647). Si supera este valor en un cálculo, se desbordará a Integer.MIN_VALUE, el valor negativo más bajo. Ver:

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

Para evitar problemas de desbordamiento, realizar el cálculo con números enteros de precisión arbitraria, proporcionada por la clase 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)); 
    } 
} 

Nota: Como usted no pidió para obtener ayuda con el problema en sí, solo estoy respondiendo la pregunta.Espero que esto ayude

+1

Este problema solo debería requerir un 'int'. – Jeffrey

+0

Tiene razón, pero: la pérdida de rendimiento de utilizar 'BigInteger' es insignificante en este problema, y ​​con' BigInteger' no tiene que preocuparse por los desbordamientos. –

+0

+1 por responder a la pregunta con la nota y por mantenerse dentro del espíritu de la ayuda de PE. –

0

Puede usar long en lugar de int.

Cada tercera expresión es par, por lo que solo necesita evaluar cada tercer valor. Esto es ligeramente más rápido porque se repite menos veces y no es necesario probar impar/par.

Sólo necesita n no el i que es menos de 4 millones.

0

Esta es la forma que tengo la respuesta:

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

Cuestiones relacionadas