2016-06-02 4 views
1

내가 오래 [] 배열의 피보나치 시퀀스를 삽입하려면이 코드를 테스트하고있어 인덱스 후 음수를 던졌습니다 : 위치 (92) 후,피보나치 시퀀스가 ​​긴 [] 배열은 92

public class Test { 
    public static void Fibonacci(int n){ 
     long[] array = new long[n]; 
     array[0]=1; 
     for (int i = 1; i < n; i++) { 
      if (i==1) { 
       array[i]=i; 
      } 
      else { 
       array[i] = array[i-2] + array[i-1]; 
      } 
     } 
     System.out.println(array[n-3]+" "+array[n-2]); // verify sum 
     System.out.println(array[n-1]); 
    } 
    public static void main(String[] args) { 

     Scanner scan = new Scanner(System.in); 

     System.out.print("Insert Fibonacci sequence index: "); 
     int n = scan.nextInt(); 

     Fibonacci(n); 
    } 
} 

그러나, 그것은 잘못된 던지기 시작 음수. 저는이 번호를 확인하기 위해이 Fibonacci Calculator을 사용하고 있습니다. 그리고 92까지는 정확합니다. 이 문제에 대한 몇 가지 질문을 보았습니다. 대부분의 대답은 Integer 오버플로에 대해 말하고 있으며, 사용하고있는 long을 사용해야합니다.

롱 타입의 한계를 넘은 93 번째는? 대신 100 개 이상의 숫자에 도달하고 배열로 관리하려면 무엇을 사용해야합니까?

+1

** 오버플로 **를 사용해야합니다. 'BigInteger'를 사용하십시오. –

답변

2

long 범위를 넘었습니다. BigInteger을 사용할 수 있으며 루프에서 array[1]을 추출 할 수 있습니다.

public static void fibonacci(int n) { 
    BigInteger[] array = new BigInteger[n]; 
    array[0] = array[1] = BigInteger.ONE; 

    for (int i = 2; i < n; i++) { 
     array[i] = array[i - 2].add(array[i - 1]); 
    } 
    System.out.println(array[n - 3] + " " + array[n - 2]); // verify sum 
    System.out.println(array[n - 1]); 
} 

1 같은 1 또한, 자바 명명 규칙을 따르십시오. 메소드 이름은 소문자로 시작하며 Fibonacci은 클래스 이름처럼 보입니다.

2

숫자 오버플로로 실행 중입니다. 이 문제를 해결하기 위해 임의 정밀도 arichmetics를 사용 BigInteger[]으로 long[] 교체, 예를 들어, 메소드 호출 식 변경

array[0] = 1; 
... 
array[i] = array[i-2] + array[i-1]; 

this table 가입일

array[0] = BigInteger.ONE; 
... 
array[i] = array[i-2].add(array[i-1]); 
1

가 92 회 피보나치 수가 7540113804746346429 및 93이다진다 12200160415121876738입니다.

range 자바 long이다 –9223372036854775808 취할 수 long가 무슨 일이 일어나고 있는지 알 수 최대 값에 피보나치 시퀀스에서 93 수를 비교

9223372036854775807에 : 당신은 사용을 고려할 수

9223372036854775807 -- max long value 
7540113804746346429 -- 92nd number in Fibonacci sequence (works) 
12200160415121876738 -- 93rd number in Fibonacci sequence (doesn't work) 

대신 BigInteger에 시퀀스 번호를 저장하십시오.

1

93 번째 숫자가 2^63-1 (java에서 가능한 가장 긴 값)보다 큽니다. 이것은 92 번째 반복 후에 변수가 오버 플로우된다는 것을 의미합니다. 더 큰 숫자를 사용하려면 BigInteger