2017-09-28 8 views
1

J'essaie d'exécuter un programme qui trouve la nième séquence dans la série Fibonacci; Cependant, le problème est, je veux implémenter BigInteger dedans afin qu'il puisse exécuter des valeurs de 1000 ou même plus.Java Fibonocci sequence BigInteger

Est-il possible de l'ajouter efficacement?

import java.util.*; 
import java.math.*; 
public class fib { 
//Arkham 
    /*public static BigInteger fibonacci2(int n) { 
    if (n == 0 || n == 1) { 
     return BigInteger.ONE; 
    } 
    return fibonacci2(n - 2).add(fibonacci2(n-1)); 
}*/ 

    public static int Fibonacci(int n) { 

     int num = Math.abs(n); 
     if (num == 0) { 
      return 0; 
     } 
     else if (num <= 2) { 
      return 1; 
     } 

     int[][] number = { { 1, 1 }, { 1, 0 } }; 
     int[][] result = { { 1, 1 }, { 1, 0 } }; 

     while (num > 0) { 
      if (num%2 == 1) result = MultiplyMatrix(result, number); 
      number = MultiplyMatrix(number, number); 
      num/= 2; 
     } 
     return result[1][1]*((n < 0) ? -1:1); 
    } 

    public static int[][] MultiplyMatrix(int[][] mat1, int[][] mat2) { 
     return new int[][] { 
       { mat1[0][0]*mat2[0][0] + mat1[0][1]*mat2[1][0], 
        mat1[0][0]*mat2[0][1] + mat1[0][1]*mat2[1][1] }, 
       { mat1[1][0]*mat2[0][0] + mat1[1][1]*mat2[1][0], 
        mat1[1][0]*mat2[0][1] + mat1[1][1]*mat2[1][1] } 
     }; 
    } 

    public static void main(String[] args) { 

     Scanner reader = new Scanner(System.in); // Reading from System.in 
     System.out.println("Enter a number: "); 
     int n = reader.nextInt(); 

     System.out.println("\n" + Fibonacci(n)); 
    } 
} 
+2

Quel est le problème avec l'utilisation 'BigInteger'? – Oleg

+0

Idk comment l'implémenter, ou l'utiliser dans cette situation spécifique. quand je mets dans 100, je devrais obtenir 354224848179261915075 à la place je reçois -980107325 – ArkhamWarfare

+0

Remplacer tout 'int' avec BigInteger' et tous les opérateurs avec des appels de méthode' Biginteger'. – Oleg

Répondre

2

lorsque vous remplacez int par BigInteger vous devriez faire quelques changements, cependant, j'ai changé votre code et est venu avec quelque chose comme ceci:

public static BigInteger FibonacciB(int n) { 
    final BigInteger one = BigInteger.ONE; 
    final BigInteger zero = BigInteger.ZERO; 
    final BigInteger two = new BigInteger(String.valueOf(2)); 
    final BigInteger minusOne = one.negate(); 

    BigInteger num = new BigInteger(String.valueOf(n)); 

    if (num.equals(zero)) { 
     return zero; 
    } else if (num.compareTo(two) <= 0) { 
     return one; 
    } 

    BigInteger[][] number = {{one, one}, {one, zero}}; 
    BigInteger[][] result = {{one, one}, {one, zero}}; 

    while (num.compareTo(zero) > 0) { 
     if (num.mod(two).equals(one)) result = MultiplyMatrixB(result, number); 
     number = MultiplyMatrixB(number, number); 
     num = num.divide(two); 
    } 

    if (num.compareTo(zero) < 0) 
     return result[1][1].multiply(minusOne); 
    return result[1][1]; 

} 

// la méthode matrice mutltiplier:

public static BigInteger[][] MultiplyMatrixB(BigInteger[][] mat1, BigInteger[][] mat2) { 

    return new BigInteger[][]{ 
      {(mat1[0][0].multiply(mat2[0][0])).add((mat1[0][1].multiply(mat2[1][0]))), 
        (mat1[0][0].multiply(mat2[0][1])).add((mat1[0][1].multiply(mat2[1][1]))) 
      }, 
      { 
        (mat1[1][0].multiply(mat2[0][0])).add((mat1[1][1].multiply(mat2[1][0]))), 
        (mat1[1][0].multiply(mat2[0][1])).add((mat1[1][1].multiply(mat2[1][1]))) 
      } 
    }; 
} 

J'espère que cela vous aiderait