Faltan detalles de la pregunta ahora; en mi respuesta, supondré que básicamente estamos teniendo problemas con el producto de dos largos largos que no encajan en largos largos .
Hay bastantes formas de verificarlo bastante rápido. No tengo puntos de referencia para comparar realmente la velocidad de treir, pero en mi práctica nunca me he enfrentado a una tarea para la que sería un cuello de botella 🙂
Una forma posible es verificar el desbordamiento primero usando double. Digamos que a, b, c son <= 1e18. El siguiente código funcionará bien entonces:
bool check_product (largo largo a, largo largo b, largo largo c)
{
doble prod = a;
prod * = b;
si (prod> 2 * c)
volver verdadero;
devuelve a * b> c;
}
- X miente de 121 1331, x ^ 2 + 1. Cuando se divide entre 11, ¿cuál no será el resto, 1, 4, 6 u 8?
- Si [matemática] a, b [/ matemática] y [matemática] n [/ matemática] son enteros positivos tales que [matemática] (a + i, b + j)> 1 [/ matemática] por cada [matemática] i , j \ in \ {0,1, \ ldots, n \} [/ math], ¿cómo se puede demostrar que necesariamente [math] a [/ math] y [math] b [/ math] tienen que ser más grandes? que [matemáticas] n ^ n [/ matemáticas]?
- Si pudieras entender instantánea y perfectamente un documento / prueba matemático publicado, ¿cuál elegirías?
- ¿Cómo resolvemos los trastornos de múltiples variables?
- ¿Z + se usa con más frecuencia para enteros positivos o se usa N \ {0} en su lugar?
Al hacerlo de esta manera, verá claramente cuando el producto es demasiado grande, y de lo contrario puede verificarlo directamente. Esto se vuelve un poco más complicado en el caso de que a, b, c sean más grandes (por ejemplo, hasta 2 ^ 63–1), pero por lo general, incluso puede usar el simple check in doble largo para tales cosas; usar doble suena arriesgado ya que no es muy preciso.
Otra posibilidad es sustituir la multiplicación con la división:
bool check_product (largo largo a, largo largo b, largo largo c)
{
si (a == 0 || b == 0)
falso retorno;
retorno (c / b <a);
}
No se olvide de la división por 0 😉 Y este código también se vuelve un poco complicado en caso de que tenga números negativos permitidos. Está bien para números no negativos, pero tendré que pensar un poco antes de decirle en qué casos funcionará y en qué casos fallará para los negativos 🙂
Otra opción es usar el tipo de datos que puede manejar números aún mayores. En caso de que su compilador admita __int128 , se vuelve realmente simple:
bool check_product (largo largo a, largo largo b, largo largo c)
{
__int128 res = a;
res * = b;
retorno (res> c);
}