En el desafío del mes pasado, tuve que evitar crear una situación en la que un error de desbordamiento pudiera causar complicaciones adicionales. De hecho, el algoritmo de exponenciación modular basado en Miller-Rabin es Prime 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 disponibles para representar los resultados. Esto ocurre a menudo, pero no exclusivamente, cuando se trabaja con números 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 mayor entero 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 de punto flotante). Para el desafío de este mes, me gustaría que idearas métodos para sumar y restar números que desbordarían la representación de números enteros de JMP. Crear dos funciones
- restarGrande ( n1 , n2 ) dónde n1 y n2 Ambos son números enteros (positivos, negativos o 0) en formato de texto. Devuelve un valor en forma de texto.
- agregarGrande ( n1 ,< n2 >) donde
n1 – número entero en forma de texto o, si n2 está vacío, una lista de números enteros (positivos, negativos o 0) en forma de texto.
n2 – número entero en forma de texto
Devuelve un valor en forma de texto.
Ejemplos
restarGrande (“9007199254740999”, “9007199254740998”) devuelve “1”
agregarGrande (“9007199254740992”,”7”) devuelve “9007199254740999”
agregarGrande ({“9007199254740999”,”-1”,”11”}) devuelve “9007199254741009”
Puntuación
- 5 puntos por una versión de agregarGrande que puede 1) sumar dos números de como máximo 1000 dígitos en menos de 30 segundos, y 2) encontrar la suma de una lista que contiene 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 de cada número no será necesariamente el mismo. Se utilizará el mismo conjunto de 10 para todas las presentaciones.
- 3 puntos adicionales por restarGrande , 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 de cada número no será necesariamente el mismo. Se utilizará el mismo conjunto de 10 para todas las presentaciones.
- 3 puntos de bonificación por el agregarGrande envío que puede sumar correctamente el mayor (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 por los 3 tercero )
- 3 puntos extra por el agregarGrande presentación que puede sumar correctamente la mayor cantidad de números de 1000 dígitos en menos de 5 segundos (2 puntos por 2 Dakota del Norte , 1 punto por 3 tercero ).
- 3 puntos extra cada uno si algún envío es tan rápido o más rápido que cualquier envío realizado por un miembro del personal de JMP.
La fecha límite de envío es el lunes 15 de junio a las 11:59 p. m., hora del este (EE. UU.). ¡Buena suerte!
Simplemente un recordatorio. Esta noche es la fecha límite para las presentaciones del Desafío 3.
Probablemente valga la pena aclararlo, ya que esto resulta un poco confuso. Ambas funciones (y ambos casos para agregarGrande ) debería poder manejar números de diferentes longitudes y signos. Probaré esto. Al determinar los puntos de bonificación de velocidad y tamaño, usaré números de la misma longitud.
Don
Anoche volví a leer la descripción del desafío y creo que das una explicación clara de los requisitos.No dude en ignorar mis consultas.¡Lo lamento!
-dave
En respuesta a mi consulta, acabo de leer su tercer ejemplo, esto sugeriría (i) que no podemos asumir que todos los números de la lista n1 tienen el mismo número de dígitos.También, (ii) podría ser que la lista n1 contenga números negativos.Presumiblemente entonces (iii) para el caso de dos números n1 y n2, ¿uno o ambos podrían ser negativos?
Quizás puedas aclarar los 3 puntos que he mencionado. Gracias.
Para el caso en el que sumamos la lista de números, ¿podemos asumir que cada número tiene la misma longitud o es algo que debemos probar? (es decir, ¿necesitamos manejar el caso general o solo el escenario de prueba que usted describió?)