En el desafío del mes pasado, tuve que evitar crear una situación en la que el error de desbordamiento pudiera causar complicaciones adicionales. De hecho, el algoritmo para la exponenciación modular en la base de Miller-Rabin isPrime La rutina está escrita para evitar este problema. Inevitablemente, se encontrará con este problema independientemente del lenguaje de programación. Se produce un error de desbordamiento cuando intenta realizar una operación que requiere más bits de los que están disponibles para representar los resultados. Esto ocurre a menudo, pero no exclusivamente, cuando se trabaja con enteros grandes. Por ejemplo, pruebe los siguientes ejemplos:
//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 es el número entero más grande que JMP puede representar antes de que ocurra el desbordamiento. Aquí hay una buena explicación de la representación de punto flotante (todos los números en JMP son coma flotante). Para el desafío de este mes, me gustaría verte proponer métodos para sumar y restar números que desbordarían la representación de enteros de JMP. Crea dos funciones
- restarBig ( n1 , n2 ) dónde n1 y n2 son ambos enteros (positivo, negativo o 0) en forma de texto. Devuelve un valor en forma de texto.
- addBig ( n1 , < n2 >) donde
n1 - entero en forma de texto o, si n2 está vacío, una lista de enteros (positivo, negativo o 0) en forma de texto.
n2 - entero en forma de texto
Devuelve un valor en forma de texto.
Ejemplos:
restarBig ("9007199254740999", "9007199254740998") devuelve "1"
addBig ("9007199254740992", "7") devuelve "9007199254740999"
addBig ({“9007199254740999”, ”- 1”, ”11”}) devuelve “9007199254741009”
Puntuación :
- 5 puntos por una versión de addBig eso puede 1) agregar dos números de como máximo 1000 dígitos en menos de 30 segundos, y 2) encontrar la suma de una lista que contenga como máximo 100 números de 100 dígitos en menos de 30 segundos. Parte 1) se probará con 10 conjuntos diferentes de números. El número de dígitos en cada número no será necesariamente el mismo. Se utilizará el mismo conjunto de 10 para todas las presentaciones.
- 3 puntos adicionales por restarBig , que debe calcular (x - y), donde x e y son números de como máximo 1000 dígitos, en menos de 30 segundos. Se utilizarán diez conjuntos diferentes de números. El número de dígitos para cada número no será necesariamente el mismo. Se utilizará el mismo conjunto de 10 para todas las presentaciones.
- 3 puntos de bonificación para el addBig envío que puede agregar correctamente el más grande (número de dígitos) n1 y n2 de igual duración, en menos de 5 segundos. (2 puntos por 2 Dakota del Norte , 1 para los 3 rd )
- 3 puntos de bonificación para el addBig envío que puede agregar correctamente la mayoría de los números de 1000 dígitos en menos de 5 segundos (2 puntos por 2 Dakota del Norte , 1 punto por 3 rd )
- 3 puntos extra cada uno si alguna presentación es tan rápida o más rápida que cualquier presentación de un miembro del personal de JMP.
La fecha límite de envío es a las 11:59 p.m. hora del Este (EE. UU.) Lunes 15 de junio th . ¡Buena suerte!