chris_de_luxe
Grünschnabel
Hallo,
ich brauche für ein Rätsel eine Fibonacci-Zahl jenseits der Millionen. Erst dachte ich an eine Schleife, merkte aber schnell das dies ewig dauert...
Im Netz fand ich eine Formel. Diese errechnet die Fib-Zahl recht schnell. Diese habe ich dann auf BigInteger- und BigDecimal-Zahlen umgestellt, damit sie mit seeehr großen Zahlen umgehen kann.
Naja, nur leider brauch sie nun auch wieder recht lange, teilweise sogar länger wie meine Schleife...
Hat von euch jemand vielleicht eine Idee, wie ich meine Anwendung noch verbessern kann?
Hier erstmal mein Code:
ich brauche für ein Rätsel eine Fibonacci-Zahl jenseits der Millionen. Erst dachte ich an eine Schleife, merkte aber schnell das dies ewig dauert...
Im Netz fand ich eine Formel. Diese errechnet die Fib-Zahl recht schnell. Diese habe ich dann auf BigInteger- und BigDecimal-Zahlen umgestellt, damit sie mit seeehr großen Zahlen umgehen kann.
Naja, nur leider brauch sie nun auch wieder recht lange, teilweise sogar länger wie meine Schleife...
Hat von euch jemand vielleicht eine Idee, wie ich meine Anwendung noch verbessern kann?
Hier erstmal mein Code:
Code:
/**
*
*/
package de.xxx.shorty;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
/**
* @author chr1s <chr1s@xxx.de>
*
*/
public class CalculateLargeFib {
public static BigInteger calcFib(int n) {
BigInteger result = null;
double sqrtfive = Math.sqrt(5);
BigDecimal termA = new BigDecimal((1+sqrtfive)/2);
BigDecimal termB = new BigDecimal((1-sqrtfive)/2);
System.out.println("termA: " + termA.toPlainString());
System.out.println("termB: " + termB.toPlainString());
termA = termA.pow(n);
termB = termB.pow(n);
System.out.println("TermA and TermB calculated!");
// System.out.println("termA: " + termA.toPlainString());
// System.out.println("termB: " + termB.toPlainString());
BigDecimal factor = new BigDecimal(1 / sqrtfive);
System.out.println("factor: " + factor.toPlainString());
BigDecimal x = termA.subtract(termB).multiply(factor);
System.out.println("x: " + x.toPlainString());
result = x.round(MathContext.UNLIMITED).toBigInteger();
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
String filename = "fibonacci_" + n +".txt";
File myFile = new File(filename);
BigInteger t = calcFib(n);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(myFile));
bw.write(t.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(t.toString());
}
}
Zuletzt bearbeitet: