erste n Ziffern einer Potenzierung

7

Wie ermittle ich die ersten n Stellen einer Potenzierung (a b )?

%Vor%     
joshu 06.10.2010, 14:04
quelle

5 Antworten

20

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 erhalten     
Alexey Malistov 06.10.2010, 15:10
quelle
4

Eine andere Lösung mit log10:

%Vor%     
user180100 08.10.2010 05:31
quelle
2

n = 9 k = 3 n ^ n = 387420489 und die Antwort sollte 387 sein

Das ist das gleiche, was @RC in seinem Code getan hat. Danke @RC Ich habe gerade die mathematische Darstellung Ihres Codes gezeigt.

    
Madan Ram 25.08.2013 18:15
quelle
1

Der 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.

    
Component 10 06.10.2010 15:02
quelle
1

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.

    
Steve Townsend 06.10.2010 15:00
quelle

Tags und Links