Berechnen Sie ein b durch die folgenden Iterationen:
a 1 = ein 1 ,
ein 2 = a 2 ,
...
ein i = ein i ,
...
ein b = a b
Sie haben ein i + 1 = ein i × a . Berechne jedes a i nicht genau. Der relative Fehler von a b ist kleiner als n mal der relative Fehler von a .
Sie möchten einen relativen Fehler kleiner als 10 -n erhalten. Daher kann der relative Fehler in jedem Schritt sein. Entfernen Sie die letzten Ziffern bei jedem Schritt.
Zum Beispiel a = 2 , b = 16 , n = 1 . Letzter relativer Fehler ist 10 -n = 0.1 . Der relative Fehler bei jedem Schritt ist 0,1 / 16 & gt; 0,001 . Daher sind bei jedem Schritt 3 Ziffern wichtig. Wenn n = 2 ist, müssen Sie 4 Ziffern speichern. Allgemeine Regel: Speichern Sie bei jedem Schritt [ n + log 10 b ] Ziffern.
2 (1), 4 (2), 8 (3), 16 (4), 32 (5), 64 (6), 128 (7), 256 (8), 512 (9), 1024 ( 10) → 102,
204 (11), 408 (12), 816 (13), 1632 (14) → 163, 326 (15), 652 (16).
Antwort: 6.
Dieser Algorithmus hat eine Komplexität von O (b) . Aber es ist einfach, es zu ändern, um O (log b)
zu erhaltenDer einfachste Weg, dies programmatisch zu tun, besteht darin, einen Stringstream zu verwenden, um das Ergebnis der Potenzierung in eine Zeichenkette umzuwandeln und dann die n höchstwertigen (d. h. linken) Zeichen zu nehmen.
Wenn Sie einen Weg ohne Strings wollen, dann wird dies funktionieren:
%Vor%Aber es ist kaum der eleganteste Code. Ich bin mir sicher, dass du es verbessern kannst.
Für diesen Fall - mit magischen Zahlen 12,13,4:
%Vor%output="1069"
%Vor%intVal = 1069
BEARBEITEN:
Dies sollte für jede Kombination funktionieren, bei der das Ergebnis double
nicht überläuft.
Tags und Links c math c++ exponentiation