Lors du défi du mois dernier, j'ai dû éviter de créer une situation dans laquelle une erreur de débordement pourrait entraîner des complications supplémentaires. En fait, l'algorithme d'exponentiation modulaire basé sur Miller-Rabin estPrime la routine est écrite 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 ce qui est disponible pour représenter les résultats. Cela se produit souvent, mais pas exclusivement, lorsque l'on travaille 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 qui JMP peut représenter avant que le débordement ne se produise. Voici une belle explication de la représentation à virgule flottante (tous les nombres dans JMP sont à virgule flottante). Pour le défi de ce mois-ci, j'aimerais vous voir proposer des méthodes permettant d'ajouter et de soustraire des nombres qui dépasseraient la représentation des nombres entiers de JMP. Créer deux fonctions
- soustraireBig ( n1 , n2 ) où n1 et n2 sont tous deux des nombres entiers (positifs, négatifs ou 0) sous forme de texte. Renvoie une valeur sous forme de texte.
- ajouterBig ( 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
soustraireBig (« 9007199254740999 », « 9007199254740998 ») renvoie « 1 »
ajouterBig (« 9007199254740992 », « 7 ») renvoie « 9007199254740999 »
ajouterBig ("9007199254740999", "-1", "11"}) renvoie "9007199254741009"
Notation
- 5 points pour une version de ajouterBig qui peut 1) additionner deux nombres d'au plus 1 000 chiffres en moins de 30 secondes, et 2) trouver la somme d'une liste contenant au plus 100 nombres de 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 jeu de 10 sera utilisé pour toutes les soumissions.
- 3 points supplémentaires pour soustraireBig , qui doit calculer (x – y), où x et y sont des nombres d'au plus 1 000 chiffres, en moins de 30 secondes. Dix séries de nombres différentes seront utilisées. Le nombre de chiffres pour chaque numéro ne sera pas nécessairement le même. Le même jeu de 10 sera utilisé pour toutes les soumissions.
- 3 points bonus pour le ajouterBig soumission qui peut additionner correctement le plus grand (nombre de chiffres) n1 et n2 de durées égales, en moins de 5 secondes. (2 points pour 2 sd , 1 pour les 3 rd )
- 3 points bonus pour le ajouterBig soumission qui peut additionner correctement le plus grand nombre de nombres à 1 000 chiffres en moins de 5 secondes (2 points pour 2 sd , 1 point pour 3 rd ).
- 3 points supplémentaires chacun si une soumission est aussi rapide ou plus rapide que n'importe quelle soumission par un membre du personnel de JMP.
La date limite de soumission est 23 h 59, heure de l'Est (États-Unis), le lundi 15 juin. Bonne chance!
Juste un rappel. Ce soir est la date limite pour les inscriptions au Défi 3.
Cela vaut probablement la peine d'être clarifié, car cela prête un peu à confusion. Les deux fonctions (et les deux cas pour ajouterBig ) devrait être capable de gérer des nombres de longueurs et de signes différents. Je vais tester ça. Lors de la détermination des points bonus de vitesse et de taille, j’utiliserai des nombres de même longueur.
Enfiler
J'ai relu la description de votre défi hier soir et je pense que vous donnez une explication claire des exigences.N'hésitez pas à ignorer mes requêtes.Désolé pour ça!
-Dave
En réponse à ma requête - je viens de lire votre 3ème exemple - cela suggérerait (je) que nous ne pouvons pas supposer que tous les nombres de la liste n1 ont le même nombre de chiffres.Aussi, (ii) il se peut que la liste n1 contienne des nombres négatifs.Vraisemblablement alors (iii) pour le cas de deux nombres n1 et n2, l'un ou les deux pourraient être négatifs ?
Peut-être pouvez-vous simplement clarifier les 3 points que j'ai mentionnés. Merci.
Dans le cas où nous ajoutons la liste de nombres, pouvons-nous supposer que chaque nombre a la même longueur ou est-ce quelque chose que nous devons tester ? (c'est-à-dire devons-nous traiter le cas général ou simplement le scénario de test que vous avez décrit ?)