If I understand correctly what you need to do (instead of writing the first n Fibonacci numbers), you need to determine if n is a Fibonacci number.
So, you have to change your method to continue generating the Fibonacci sequence until you get the number> = n. If it is equal, n is the Fibonacci number, otherwise not.
Update: Listening to @Moron has repeatedly stated that the formula-based algorithm is superior in performance to the simpler one above, I actually made a comparative comparison - specifically between Jacopo's solution as a generator algorithm and StevenH last version as a formula-based algorithm. For reference, here is the exact code:
public static void main(String[] args) { measureExecutionTimeForGeneratorAlgorithm(1); measureExecutionTimeForFormulaAlgorithm(1); measureExecutionTimeForGeneratorAlgorithm(10); measureExecutionTimeForFormulaAlgorithm(10); measureExecutionTimeForGeneratorAlgorithm(100); measureExecutionTimeForFormulaAlgorithm(100); measureExecutionTimeForGeneratorAlgorithm(1000); measureExecutionTimeForFormulaAlgorithm(1000); measureExecutionTimeForGeneratorAlgorithm(10000); measureExecutionTimeForFormulaAlgorithm(10000); measureExecutionTimeForGeneratorAlgorithm(100000); measureExecutionTimeForFormulaAlgorithm(100000); measureExecutionTimeForGeneratorAlgorithm(1000000); measureExecutionTimeForFormulaAlgorithm(1000000); measureExecutionTimeForGeneratorAlgorithm(10000000); measureExecutionTimeForFormulaAlgorithm(10000000); measureExecutionTimeForGeneratorAlgorithm(100000000); measureExecutionTimeForFormulaAlgorithm(100000000); measureExecutionTimeForGeneratorAlgorithm(1000000000); measureExecutionTimeForFormulaAlgorithm(1000000000); measureExecutionTimeForGeneratorAlgorithm(2000000000); measureExecutionTimeForFormulaAlgorithm(2000000000); } static void measureExecutionTimeForGeneratorAlgorithm(int x) { final int count = 1000000; final long start = System.nanoTime(); for (int i = 0; i < count; i++) { isFibByGeneration(x); } final double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9; System.out.println("Running generator algorithm " + count + " times for " + x + " took " +elapsedTimeInSec + " seconds"); } static void measureExecutionTimeForFormulaAlgorithm(int x) { final int count = 1000000; final long start = System.nanoTime(); for (int i = 0; i < count; i++) { isFibByFormula(x); } final double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9; System.out.println("Running formula algorithm " + count + " times for " + x + " took " +elapsedTimeInSec + " seconds"); } static boolean isFibByGeneration(int x) { int a=0; int b=1; int f=1; while (b < x){ f = a + b; a = b; b = f; } return x == f; } private static boolean isFibByFormula(int num) { double first = 5 * Math.pow((num), 2) + 4; double second = 5 * Math.pow((num), 2) - 4; return isWholeNumber(Math.sqrt(first)) || isWholeNumber(Math.sqrt(second)); } private static boolean isWholeNumber(double num) { return num - Math.round(num) == 0; }
The results surprised me even:
Running generator algorithm 1000000 times for 1 took 0.007173537000000001 seconds Running formula algorithm 1000000 times for 1 took 0.223365539 seconds Running generator algorithm 1000000 times for 10 took 0.017330694 seconds Running formula algorithm 1000000 times for 10 took 0.279445852 seconds Running generator algorithm 1000000 times for 100 took 0.030283179 seconds Running formula algorithm 1000000 times for 100 took 0.27773557800000004 seconds Running generator algorithm 1000000 times for 1000 took 0.041044322 seconds Running formula algorithm 1000000 times for 1000 took 0.277931134 seconds Running generator algorithm 1000000 times for 10000 took 0.051103143000000004 seconds Running formula algorithm 1000000 times for 10000 took 0.276980175 seconds Running generator algorithm 1000000 times for 100000 took 0.062019335 seconds Running formula algorithm 1000000 times for 100000 took 0.276227007 seconds Running generator algorithm 1000000 times for 1000000 took 0.07422898800000001 seconds Running formula algorithm 1000000 times for 1000000 took 0.275485013 seconds Running generator algorithm 1000000 times for 10000000 took 0.085803922 seconds Running formula algorithm 1000000 times for 10000000 took 0.27701090500000003 seconds Running generator algorithm 1000000 times for 100000000 took 0.09543419600000001 seconds Running formula algorithm 1000000 times for 100000000 took 0.274908403 seconds Running generator algorithm 1000000 times for 1000000000 took 0.10683704200000001 seconds Running formula algorithm 1000000 times for 1000000000 took 0.27524084800000004 seconds Running generator algorithm 1000000 times for 2000000000 took 0.13019867100000002 seconds Running formula algorithm 1000000 times for 2000000000 took 0.274846384 seconds
In short, the generator algorithm algorithm is superior to the solution based on the formula for all positive values of int - even close to the maximum value of int, it is more than twice as fast! -)
To write, modifying the above code to use long variables instead of int , the generator algorithm becomes slower (as expected, since it should now add long values) and the intersection point where the formula starts to be faster - about 1000000000000L, i.e. 10 12 .
Update2: As Ivlad and Moron noted, I am not a very expert in floating point calculations :-), based on my suggestions, I improved the formula for this:
private static boolean isFibByFormula(long num) { double power = (double)num * (double)num; double first = 5 * power + 4; double second = 5 * power - 4; return isWholeNumber(Math.sqrt(first)) || isWholeNumber(Math.sqrt(second)); }
This has led to a decrease in the intersection point of approx. 10 8 (for the long version, the generator with int is still faster for all int values). Undoubtedly, replacing sqrt calls with something like the one suggested by @Moron will further lower the jump point.
My (and IVlad's) point was simply that there would always be an intersection point below which the generator algorithm would be faster. Therefore, statements that one of them works better do not make sense at all, only in context.