2

呼び出し可能オブジェクトを使用してフィボナッチ数列を実装しようとしていますが、呼び出し可能フィボナッチの初期値に3,4、5、6、および2000をシードしました。取得する出力は次のとおりです。

3 5 8 13 -820905900187520670

問題は、呼び出し可能オブジェクトでfib(2000)を計算しようとしているときです。誰かが以下に提供されている私のコードを見て、私のアプローチのどこが間違っているのかを知ることができますか?

import java.util.concurrent.*;
import java.util.*;

class FibonacciGen implements Callable<Long>{
    private Long fib;
    public FibonacciGen(long num){
        this.fib = num;
    }
    public Long call(){
        return calculateFibonacci(fib);
    }

    private long calculateFibonacci(long someNum){
        long firstNum = 0L;
        long secondNum = 1L;
        long counter = 0L;
        while(counter<someNum){
            long fibCalc = secondNum+firstNum;
            firstNum = secondNum;
            secondNum = fibCalc;
            counter= counter+1L;
        }
        return secondNum;
    }   

}

public class FibonacciCallable{
    public static void main(String[] args){
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Callable<Long>> results = new ArrayList<Callable<Long>>();
        CompletionService<Long> ecs = new ExecutorCompletionService<Long>(exec);
        results.add(new FibonacciGen(3L));
        results.add(new FibonacciGen(4L));
        results.add(new FibonacciGen(5L));
        results.add(new FibonacciGen(6L));
        results.add(new FibonacciGen(2000L));
            try{
                for(Callable<Long> fs:results){
                    ecs.submit(fs);
                }
                System.out.println("Submitted all the tasks");
                int n = results.size();
                for(int i=0;i<n;++i){
                    System.out.println("Taking the first completed task");
                    Long r = ecs.take().get();
                    if(r != null)
                        System.out.println(r);
                    }   


            }
            catch(InterruptedException ex){System.out.println(ex);return;}
            catch(ExecutionException e){System.out.println(e);}
            finally{exec.shutdown();}
        }
}

ありがとう

4

1 に答える 1

6

Javaはオーバーフロー時に例外をスローせず、値をラップするだけです。そのため、奇妙な結果が得られます。フィボナッチは急成長しているシーケンスであり、2000年です。要素ははるかに超えていますlong

を使用してみてくださいBigInteger。任意の精度が得られます(明らかにパフォーマンスが犠牲になります)。

于 2012-04-19T17:19:07.250 に答える