¿Cómo debo tomar una entrada de orden 10 ^ 250 usando una matriz de caracteres en C?

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.

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.

Si la pregunta es cómo hacer aritmética de longitud arbitraria en C, existen bibliotecas para este tipo de cosas. Sí, tiene que hacer cosas usando cadenas, listas enlazadas u otra estructura de datos que permita números largos, y las partes difíciles están en su mayoría haciendo que las matemáticas básicas no sean lentas mientras que todavía tiene “acarreos” funcionando correctamente.

La página wiki no es mala en este tema:

Aritmética de precisión arbitraria

Los números de longitud arbitraria y las matemáticas asociadas no son compatibles de forma nativa con C (o la mayoría de los otros lenguajes). Pero la función de utilidad “dc” (una “calculadora” de línea de comandos) lo hace en Unix / Linux, por lo que es posible que desee echar un vistazo a su código (y posiblemente haga lo que necesita para no tener que escribir el C usted mismo).

El bit de código que publicó está convirtiendo una cadena en un entero, pero solo funcionará si el número en la cadena es lo suficientemente pequeño como para caber en “b” (es decir, si “b” es un entero sin signo de 32 bits, el contenido de la matriz “a” tiene que estar entre 0 y 4294967296-1.

Usted no 10 a esa potencia es algo que ni siquiera se ajusta al direccionamiento actual de 64 bits.

Si tiene una cantidad tan inmensa de datos (lo cual es divertido, realmente, me pregunto qué tipo de datos tiene allí y dónde los almacena), los lee en fragmentos que puede morder. De la misma manera que comerías un elefante: un bocado a la vez.

Si piensa en cómo se calculan los números, su suma de productos de bases a la enésima potencia
Imagina 274 = 2 * 100 + 7 * 10 +4
Entonces, para calcular el resultado dígito por dígito, haga esto

b = 0
Haz un bucle mientras puedas:
b = (b * 10) + (a [i] – ‘0’)
i ++

Por lo tanto, cambia a la derecha en la posición (multiplica por 10) agrega el valor ordinal del dígito menos el valor ordinal de 0
(el valor de cualquier número dado es su distancia desde el origen)

¿Eso parece correcto?

Puedes leerlo desde un archivo de texto. Si está interesado en la aritmética con este número tan grande, necesitará una computadora con un direccionamiento de al menos 831 bits o una biblioteca de alta precisión. Si está haciendo algunas manipulaciones de cadenas, entonces es bastante sencillo.

Como una cuerda y úsela en consecuencia.