Bei der Herausforderung im letzten Monat musste ich vermeiden, eine Situation zu schaffen, in der Überlauffehler zusätzliche Komplikationen verursachen könnten. Tatsächlich basiert der Algorithmus für die modulare Exponentiation im Miller-Rabin isPrime Routine wird geschrieben, um dieses Problem zu vermeiden. Unweigerlich werden Sie auf dieses Problem stoßen, unabhängig von der Programmiersprache. Ein Überlauffehler tritt auf, wenn Sie versuchen, eine Operation auszuführen, die mehr Bits erfordert, als zur Darstellung der Ergebnisse verfügbar sind. Dies tritt häufig, aber nicht ausschließlich, bei der Arbeit mit großen Ganzzahlen auf. Versuchen Sie beispielsweise die folgenden Beispiele:
//Example 1
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x+i));
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x-i));
//Example 2
n1 = 9007199254740999;
n2 = 1;
Print(n1-n2);
2 53 ist die größte Ganzzahl, die JMP darstellen kann, bevor ein Überlauf auftritt. Hier ist eine schöne Erklärung der Gleitkommadarstellung (Alle Zahlen in JMP sind Gleitkommazahlen). Für die Herausforderung dieses Monats würde ich gerne sehen, dass Sie Methoden zum Addieren und Subtrahieren von Zahlen entwickeln, die die Darstellung von Ganzzahlen durch JMP überlaufen würden. Erstellen Sie zwei Funktionen
- subtrahierenBig ( n1 , n2 ) wo n1 und n2 sind beide Ganzzahlen (positiv, negativ oder 0) in Textform. Gibt einen Wert in Textform zurück.
- addBig ( n1 , < n2 >) wo
n1 - Ganzzahl in Textform oder, wenn n2 ist leer, eine Liste von Ganzzahlen (positiv, negativ oder 0) in Textform.
n2 - Ganzzahl in Textform
Gibt einen Wert in Textform zurück.
Beispiele:
subtrahierenBig ("9007199254740999", "9007199254740998") gibt "1" zurück.
addBig ("9007199254740992", "7") gibt "9007199254740999" zurück.
addBig ({"9007199254740999", "- 1", "11"}) gibt "9007199254741009" zurück.
Wertung ::
- 5 Punkte für eine Version von addBig Das kann 1) in weniger als 30 Sekunden zwei Zahlen mit höchstens 1000 Stellen hinzufügen und 2) in weniger als 30 Sekunden die Summe einer Liste mit höchstens 100 100-stelligen Zahlen ermitteln. Teil 1) wird mit 10 verschiedenen Zahlenreihen getestet. Die Anzahl der Ziffern in jeder Nummer muss nicht unbedingt gleich sein. Für alle Einsendungen wird der gleiche Satz von 10 verwendet.
- 3 zusätzliche Punkte für subtrahierenBig , die in weniger als 30 Sekunden (x - y) berechnen muss, wobei x und y Zahlen mit höchstens 1000 Stellen sind. Es werden zehn verschiedene Zahlenreihen verwendet. Die Anzahl der Ziffern für jede Nummer muss nicht unbedingt gleich sein. Für alle Einsendungen wird der gleiche Satz von 10 verwendet.
- 3 Bonuspunkte für die addBig Einreichung, die die größte korrekt hinzufügen kann (Anzahl der Ziffern) n1 und n2 von gleicher Länge in weniger als 5 Sekunden. (2 Punkte für 2 nd , 1 für die 3 rd )
- 3 Bonuspunkte für die addBig Einreichung, die die meisten 1000-stelligen Zahlen in weniger als 5 Sekunden korrekt hinzufügen kann (2 Punkte für 2 nd 1 Punkt für 3 rd ).
- Jeweils 3 zusätzliche Punkte, wenn eine Einreichung so schnell oder schneller ist als eine Einreichung eines JMP-Mitarbeiters.
Einsendeschluss ist Montag, 15. Juni, 23:59 Uhr Eastern (US) th . Viel Glück!