2017-06-04 6 views
3

Ich habe eine FormelVerschiedene out für gleiche Funktion in Java gegen Python

((x+y-1)*(x+y-2))/2 + x 

und erhalten die Stringdarstellung um sie zu bewerten. So in Java 1.7 Ich schreibe

public static void main(String[] args) 
{ 
    int x = 99999; 
    int y = 99999; 
    int answer = ((x+y-1)*(x+y-2))/2 + x; 
    String s = Integer.toString(answer); 
    System.out.println(s); 
} 

und in Python 2,7

def answer(x, y): 
    z = ((x+y-1)*(x+y-2))/2 + x 
    return str(z); 

print(answer(99999,99999)) 

Java gab mir die von 672047173 löschte während Python mir 19999400005 gab und scheint der Wert von Python korrekt ist. Was ist der Grund für diesen Unterschied?

Antwort

6

19999400005 ist ein zu großer Wert für int Variablen, so dass die Java-Berechnungen überlaufen würden. stattdessen

Verwenden long Variablen:

public static void main(String[] args) 
{ 
    long x = 99999; 
    long y = 99999; 
    long answer = ((x+y-1)*(x+y-2))/2 + x; 
    String s = Long.toString(answer); 
    System.out.println(s); 
} 

Ausgang ist:

19999400005 

Beachten Sie auch, dass Sie answer direkt drucken können, und nicht, sie zu String konvertieren müssen explizit:

System.out.println(answer); 
+1

Java-Berechnungen in diesem Fall definitiv Überlauf. – syntagma

+0

dummer Fehler von mir. Danke für die Erklärung. –

3

Weil Ganzzahlbereich in Java m ist Minimum -2.147.483.648 und ein Höchstwert von 2.147.483.647.

int Antwort = ((x + y-1) * (x + y-2))/2 + x;

In dieser Zeile weisen Sie den Wert für den höheren Bereich der Ganzzahl zu. Es verursacht einen Integer-Überlauf bei der arithmetischen Operation. Deshalb erhalten Sie einen falschen Wert, um den korrekten Wert zu erhalten. Verwenden Sie den Datentyp Long.

public static void main(String[] args) 
{ 
    int x = 99999; 
    int y = 99999; 
    long answer = (((x+y-1)*1l)*((x+y-2)*1l))/2 + x; 
    String s = Long.toString(answer); 
    System.out.println(s); 
} 
+0

Dies funktioniert immer noch nicht. 'int * int' gibt das Ergebnis in' int' und weist es dann 'long' zu, so dass Sie immer noch eine Antwort mit der Bezeichung 'integer overflow' erhalten würden. Wenn Sie das gleiche mit "integer" machen wollen, können Sie das als '1L * (x + y-1) * (x + y-2) tun. Dies wird nun' multiplication' Operation in 'long' machen. –

+0

Sie liegen hier falsch. Das implizite Casting wird nach der Multiplikation durchgeführt und die Multiplikation wird im Integer-Datentyp durchgeführt, was zu einem Überlauf führt und Ihnen eine falsche Antwort gibt. Sie können dies überprüfen, indem Sie Ihr Snippet ausführen. –

+0

Danke. Ich nehme an, du hast Recht. – Ankur

Verwandte Themen