2017-08-19 4 views
0

ich ein Protokoll Wert Y gegeben haben, ich will den Anti-Log von Y dhFinden Sie den modo Wert

ans = (Math.pow(10,Y))%mod 

wo mod = 1e9+7 und der anti-Log von Y berechnen wird immer integer dh
Y berechnen als folgen Y= log(a) a is very large integer of range 10^100000

Also für gegebene Y muss ich ans berechnen? Wie man das unter Berücksichtigung der Mod-Operation macht.

Mein Ansatz

double D = Y -(int)Y 
long Pow = (long)Y 

    for(int i=1;i<=Pow;i++) ans = (ans*10)%mod; 

    ans = (ans*Math.pow(10,D))%mod 

Aber es ist nicht richtig kann jemand effizienten Ansatz vorschlagen, hier sein? BigDecimal kann dort nützlich sein?
Beispiel:

Y = 16.222122660468525 

die straight forward-Methode und Abrunden d.h Math.log(10,Y) mir 1667718169966651 geben, aber die Verwendung von Schleifen es ist mir 16677181699666510. Ich benutze Mod jetzt nicht nur erklären, dass es einen Fehler gibt.

Hier Y ist klein, so direkte Methode funktioniert und wir können Mod leicht nehmen. wenn Y ein Bereich von 10000 ist, wird es nicht funktionieren und überlaufen, so dass wir Mod verwenden müssen.

+0

Nur um zu bestätigen, ist das Protokoll hier "log (a)" oder "log10 (a)"? und warum wird Math.pow (Math.E, (Math.log (a))) nicht funktionieren, um den Antilog zu finden? – nullpointer

+0

@nullpointer es ist Basis 10 – Regression

+0

Was ist dann falsch mit Math.pow (10, (Math.log (a))) '? – nullpointer

Antwort

0

Ich denke, es ist Arbeit sollte

double D = Y -(int)Y 
long Pow = (long)Y 

for(int i=1;i<=Pow;i++) ans = (ans*10)%mod; 

ans = (ans*Math.pow(10,D)) 
ans = Math.round(ans) 
ans%=mod 
+0

Ich glaube nicht, dass es genau ist, wenn "Y" groß ist – Regression

0

Es ist ein Fehler in Ihrem Urteil hier - die Schleife Methode ist nicht auf Fehler.

Der Wert a in Ihrem Beispiel hat 17 Integer-Ziffern. Von this stackoverflow post hat ein double ~ 16 signifikante Stellen der Genauigkeit. So beide die Schleife und direkte Berechnungen sind in der Tat durch mangelnde Präzision begrenzt.

(.? Nur um zu bestätigen, ein high precision calculator verwenden, wird der Wert von a ist 16677181699666650.8689546562984070600381634077... So Ihre beiden Werte sind falsch - es sei denn Sie sie falsch kopiert)

So Ihre Schleife Methode ist nicht das Problem; Sie brauchen nur eine höhere Präzisionsmethode, um den letzten Schritt auszuführen (Berechnung pow(10, frac(Y))).


Als Randbemerkung, ist es eine effizientere Möglichkeit, die Schleife Teil tun - this post mehr Details hat.

Verwandte Themen