La línea de código que citó es una forma iterativa de analizar un número de una matriz, suponiendo que la matriz contenga solo dígitos (sin signos, comas, puntos decimales o exponentes).
Dado que se requieren todos los dígitos, sin notación exponencial o científica, sin separadores de grupos de dígitos, y dado que solo se pueden ingresar enteros, entonces para una entrada de orden 10 ^ 250 tendrá hasta 251 dígitos, y probablemente querrá algunos caracteres adicionales para un retorno de carro, salto de línea o carácter NUL final. Una matriz de longitud 255 debería ser suficiente.
Al convertir esto en un número, debe observar los tipos flotante , doble y doble largo para ver si cumplen con sus requisitos. En general, incluso el tipo doble largo tendrá solo unos 100 bits binarios (unos 30 dígitos significativos) de precisión, por lo que perderá los valores de los dígitos de orden inferior en sus matemáticas a menos que esté utilizando una biblioteca matemática de precisión arbitraria. Además, verifique el rango de exponentes permitidos en su tipo de datos, ya que querrá un tipo de datos que pueda manejar un exponente del tamaño de 10 ^ 250 en lugar de, digamos 2 ^ 127. Un exponente de 16 bits debería ser suficiente.
- ¿Cuál es el enunciado del problema resuelto por el algoritmo Bellman-Ford?
- ¿Por qué los finalistas de Topcoder no comparten su experiencia en los tutoriales de YouTube para principiantes? Cualquier principiante agradecería la ayuda para desarrollar sus habilidades para resolver problemas.
- ¿Necesito matemáticas para aprender estructuras de datos y algoritmos?
- ¿Cómo es posible que algún algoritmo sea más rápido que cualquier otro algoritmo similar para algunos valores de la variable de entrada y más lento para otros valores?
- Estructuras de datos: ¿Cuál es una explicación intuitiva de los árboles rojo-negros?
El pseudocódigo no optimizado muy similar a C es entonces:
char inputBuffer [255];
obtiene (inputBuffer);
char * a = & inputBuffer [0];
t_InfinitePrecisionFloat b;
lib_InfinitePrecisionFloat_SetToFloat (& b, 0.0f);
while (isdigit (* a))
{
// Este bucle asume la codificación ASCII. Los códigos ASCII para el
// los dígitos 0..9 son secuenciales y, por lo tanto, restan ‘0’ del ASCII
// el carácter produce el valor numérico del dígito.
lib_InfinitePrecisionFoat_ScaleByFloat (& b, 10.0f); // El resultado del desplazamiento dejó un dígito
lib_InfinitePrecisionFloat_AddFloat (& b, (float) (* a ++ – ‘0’)); // “O” en el siguiente dígito usando la suma que nunca lleva
}
// En este punto, el número está en ‘b’
printf (“El resultado es:% s \ n”, lib_InfinitePrecisionFloat_ToStringAllDigits (& b));
Si no tiene una biblioteca matemática de precisión infinita, puede intentar usar un tipo de datos doble largo para b, y las operaciones incorporadas =, *, + y% Lf para ver cómo le va.