Wie geht index * int in einer for-Schleife mit null als Ergebnis?

8

Wir haben nur zum Spaß versucht, eine for-Schleife wie unten zu erstellen. Wir nahmen an, dass die Zahl, die wir bekommen, sehr hoch ist, aber wir haben 0. Warum ist es 0 und nicht etwas Großes? Wir haben es sogar lange versucht, weil wir dachten, es könnte größer sein als ein Int. Vielen Dank im Voraus.

%Vor%     
TheOddCoder 09.08.2017, 07:36
quelle

4 Antworten

11

Dein int wird auf -2147483648 umgebrochen, wenn es +2147483647 erreicht.

Durch einen erstaunlichen Zufall 1 wird eine Multiplikation mit Null in Ihr Produkt eingeführt.

Überzeugen Sie sich selbst: Schreiben Sie

%Vor%

Sie benötigen ein BigInteger , um 100 zu bewerten!.

1 Wirklich ist es nicht so erstaunlich: es sind nur 100! hat 2 32 als Faktor.

    
Bathsheba 09.08.2017, 07:39
quelle
0

Ihre for-Schleife berechnet den Faktor 100, d. h. 1 * 2 * 3 * ... * 99 * 100, auch als 100 geschrieben! was entspricht 9.332621544 × 10157

Der Bereich von int ist -2.147.483.648 bis 2.147.483.647 und der Bereich von long ist -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807, also haben Sie mit einer Zahl von 10157 einen Multiplikationsüberlauf, bevor Sie sich dem Ende der for-Schleife nähern.

Der Überlauf führt schließlich dazu, dass alle Bits schließlich auf Null gesetzt werden, wodurch das Ergebnis 0 erzeugt wird.

    
Kim Burgaard 09.08.2017 07:45
quelle
0

Ihre Datentypen sind zu klein, auch wenn Sie lange verwenden, so dass Sie diese Berechnung mit Grundtypen nicht tun können. So haben Sie einen Überlauf erhalten, wo die Werte negativ werden, und an einem gewissen Punkt 0. Daher ist das Ergebnis immer noch Null nach jeder Schleife.

Sie können das sehen, indem Sie currentSolution in der Schleife drucken.

Um die richtige Lösung zu erhalten, versuchen Sie es mit BigInteger :

%Vor%

Dies gibt die richtige Lösung: 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000

    
Thomas Böhm 09.08.2017 07:42
quelle
-3

Sie berechnen grundsätzlich 100 !, was etwa 9,3e + 157 ist, während ein langer Maximalwert 2 ^ 64 -1 ist, also etwa 1,8e + 19.

Es passt nicht, deshalb haben Sie 0.

    
Asew 09.08.2017 07:40
quelle

Tags und Links