Dans le défi du mois dernier, j'ai dû éviter de créer une situation où une erreur de débordement pourrait entraîner des complications supplémentaires. En fait, l'algorithme d'exponentiation modulaire dans la base de Miller-Rabin isPrime est écrit pour éviter ce problème. Inévitablement, vous rencontrerez ce problème quel que soit le langage de programmation. Une erreur de débordement se produit lorsque vous essayez d'effectuer une opération nécessitant plus de bits que ceux disponibles pour représenter les résultats. Cela se produit souvent, mais pas exclusivement, lorsque vous travaillez avec de grands nombres entiers. Par exemple, essayez les exemples suivants:
//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 est le plus grand entier que JMP peut représenter avant qu'un débordement ne se produise. Voici une belle explication de la représentation en virgule flottante (tous les nombres dans JMP sont en virgule flottante). Pour le défi de ce mois, je voudrais vous voir proposer des méthodes pour ajouter et soustraire des nombres qui déborderaient la représentation JMP des entiers. Créez deux fonctions
- subtractBig ( n1 , n2 ) où n1 et n2 sont les deux entiers (positifs, négatifs ou 0) sous forme de texte. Renvoie une valeur sous forme de texte.
- addBig ( n1 , < n2 >) où
n1 - entier sous forme de texte ou, si n2 est vide, une liste d'entiers (positifs, négatifs ou 0) sous forme de texte.
n2 - entier sous forme de texte
Renvoie une valeur sous forme de texte.
Exemples:
subtractBig ("9007199254740999", "9007199254740998") renvoie "1"
addBig ("9007199254740992", "7") renvoie "9007199254740999"
addBig ({"9007199254740999", "- 1", "11"}) renvoie "9007199254741009"
Notation :
- 5 points pour une version de addBig cela peut 1) ajouter deux nombres d'au plus 1000 chiffres en moins de 30 secondes, et 2) trouver la somme d'une liste contenant au plus 100, 100 chiffres en moins de 30 secondes. La partie 1) sera testée avec 10 ensembles de nombres différents. Le nombre de chiffres de chaque numéro ne sera pas nécessairement le même. Le même ensemble de 10 sera utilisé pour toutes les soumissions.
- 3 points supplémentaires pour subtractBig , qui doit calculer (x - y), où x et y sont des nombres d'au plus 1000 chiffres, en moins de 30 secondes. Dix ensembles différents de nombres seront utilisés. Le nombre de chiffres pour chaque numéro ne sera pas nécessairement le même. Le même ensemble de 10 sera utilisé pour toutes les soumissions.
- 3 points bonus pour le addBig soumission pouvant ajouter correctement le plus grand (nombre de chiffres) n1 et n2 de longueurs égales, en moins de 5 secondes. (2 points pour 2 Dakota du Nord , 1 pour le 3 rd )
- 3 points bonus pour le addBig soumission qui peut ajouter correctement le plus grand nombre de 1000 chiffres en moins de 5 secondes (2 points pour 2 Dakota du Nord , 1 point pour 3 rd ).
- 3 points supplémentaires chacun si une soumission est aussi rapide ou plus rapide que toute soumission d'un membre du personnel de JMP.
La date limite de soumission est 23 h 59, heure de l'Est (États-Unis), lundi 15 juin e . Bonne chance!