Problem:
Schreiben Sie in der von Ihnen gewählten Sprache die kürzeste Funktion, die den Grund der Quadratwurzel einer 64-Bit-Ganzzahl ohne Vorzeichen zurückgibt.
Testfälle:
Ihre Funktion muss für alle Eingaben korrekt funktionieren. Die folgenden Beispiele veranschaulichen die Idee:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
Regeln:
- Sie können Ihre Funktion beliebig benennen. (Unbenannte, anonyme oder Lambda-Funktionen sind in Ordnung, sofern sie irgendwie aufrufbar sind.)
- Die Anzahl der Zeichen ist das Wichtigste bei dieser Herausforderung, aber auch die Laufzeit ist wichtig. Ich bin sicher, Sie könnten iterativ nach der Antwort in O (√n) -Zeit mit einer sehr kleinen Zeichenanzahl suchen, aber die O (log (n)) -Zeit wäre wirklich besser (das heißt, wenn Sie einen Eingabewert von n annehmen würden). keine Bitlänge von n).
- Möglicherweise möchten Sie die Funktion mit rein ganzzahliger und / oder boolescher Artithmetik implementieren. Wenn Sie jedoch wirklich Gleitkommaberechnungen verwenden möchten, ist dies in Ordnung, solange Sie keine Bibliotheksfunktionen aufrufen. Einfach
return (n>0)?(uint32_t)sqrtl(n):-1;
in C zu sagen ist also tabu, obwohl es das richtige Ergebnis liefern würde. Wenn Sie mit Fließkommaarithmetik, können Sie verwenden*
,/
,+
,-
, und Potenzierung (zB**
oder^
wenn es eine eingebauter Operator in der Sprache Ihrer Wahl, sondern nur Potenzierung der Kräfte nicht weniger als 1 ). Diese Einschränkung soll das "Betrügen" verhindern, indem Siesqrt()
eine Variante aufrufen oder einen Wert auf die halbe Potenz erhöhen. - Wenn Sie Gleitkommaoperationen verwenden (siehe Nr. 3), ist es nicht erforderlich, dass der Rückgabetyp eine Ganzzahl ist. Nur, dass der Rückgabewert eine Ganzzahl ist, z. B. floor (sqrt (n)), und in der Lage ist, jeden vorzeichenlosen 32-Bit-Wert zu speichern.
- Wenn Sie C / C ++ verwenden, können Sie davon ausgehen, dass 64-Bit- und 32-Bit-Integer-Typen ohne Vorzeichen vorhanden sind, z. B.
uint64_t
unduint32_t
wie in definiertstdint.h
. Stellen Sie andernfalls sicher, dass Ihr Integer-Typ 64-Bit-Integer ohne Vorzeichen aufnehmen kann. - Wenn Ihre Sprache keine 64-Bit-Ganzzahlen unterstützt (z. B. hat Brainfuck anscheinend nur 8-Bit-Ganzzahlenunterstützung), tun Sie Ihr Bestes, und geben Sie die Einschränkung in Ihrem Antworttitel an. Das heißt, wenn Sie herausfinden können, wie Sie eine 64-Bit-Ganzzahl codieren und die Quadratwurzel mit einer primitiven 8-Bit-Arithmetik korrekt erhalten, dann haben Sie mehr Power!
- Viel Spaß und kreativ werden!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2