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 double
und 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 T
eine Fibonacci-Zahl ist, ist idx
dies der 1-basierte Index dieser Zahl in der Fibonacci-Sequenz. (mit einer bemerkenswerten Ausnahme)
Die Fibonacci-Sequenz ist 1 1 2 3 5 8 13
usw.
3 ist die 4. Zahl in der Sequenz: IsFib(3, out idx);
wird zurückgegeben true
und bewertet 4
.
8 ist die 6. Zahl in der Sequenz: IsFib(8, out idx);
wird zurückgegeben true
und bewertet 6
.
13 ist die 7. Zahl; IsFib(13, out idx);
wird zurückkehren true
und 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 IsFib
eine Nicht-Fibonacci-Zahl übergeben wird, wird diese zurückgegeben false
, und der Wert von idx
ist der Index der größten Fibonacci-Zahl kleiner als T
.
16 ist kein Fibonacci-Wert.
IsFib(16, out idx);
wird zurückkehren false
und 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.