Während mehrere Personen auf die Lösung mit dem perfekten Quadrat hinweisen, wird eine Fibonacci-Zahl quadriert, was häufig zu einem massiven Produkt führt.
Es gibt weniger als 80 Fibonacci-Zahlen, die sogar in einer Standard-64-Bit-Ganzzahl gespeichert werden können.
Hier ist meine Lösung, die völlig kleiner arbeitet als die zu testende Anzahl.
(In C # geschrieben, mit Basistypen wie doubleund long. Der Algorithmus sollte jedoch für größere Typen gut funktionieren.)
static bool IsFib(long T, out long idx)
{
double root5 = Math.Sqrt(5);
double phi = (1 + root5) / 2;
idx = (long)Math.Floor( Math.Log(T*root5) / Math.Log(phi) + 0.5 );
long u = (long)Math.Floor( Math.Pow(phi, idx)/root5 + 0.5);
return (u == T);
}
Mehr als 4 Jahre nachdem ich diese Antwort geschrieben hatte, fragte ein Kommentator nach dem zweiten Parameter, der vorbeigegangen war
out.
Parameter 2 ist der "Index" in der Fibonacci-Sequenz.
Wenn der zu testende Wert Teine Fibonacci-Zahl ist, ist idxdies der 1-basierte Index dieser Zahl in der Fibonacci-Sequenz. (mit einer bemerkenswerten Ausnahme)
Die Fibonacci-Sequenz ist 1 1 2 3 5 8 13usw.
3 ist die 4. Zahl in der Sequenz: IsFib(3, out idx);wird zurückgegeben trueund bewertet 4.
8 ist die 6. Zahl in der Sequenz: IsFib(8, out idx);wird zurückgegeben trueund bewertet 6.
13 ist die 7. Zahl; IsFib(13, out idx);wird zurückkehren trueund Wert 7.
Die einzige Ausnahme ist IsFib(1, out idx);, dass zurückgegeben wird 2, obwohl der Wert 1 sowohl bei Index 1 als auch bei Index 2 angezeigt wird.
Wenn IsFibeine Nicht-Fibonacci-Zahl übergeben wird, wird diese zurückgegeben false, und der Wert von idxist der Index der größten Fibonacci-Zahl kleiner als T.
16 ist kein Fibonacci-Wert.
IsFib(16, out idx);wird zurückkehren falseund Wert 7.
Sie können die Binet-Formel verwenden , um den Index 7 in den Fibonacci-Wert 13 umzuwandeln. Dies ist die größte Zahl unter 16.