¿Qué hay de malo en el código de suma de enteros grandes C++?
La suma de enteros grandes se divide en dos partes: finalización bit a bit y suma de dígitos. El programa tiene problemas con ambas partes, que se detallan a continuación.
En la parte de suma del valor posicional, se deben usar |c1-c2| 0 para completar dígitos más cortos, pero el método incorrecto es usar 0 en lugar de 0 en lugar de la suma, y el valor posicional no es completado después del cálculo. El enfoque correcto es:
Calcular el número de ceros que se deben agregar, es decir |c1-c2|.
Luego completa esta cadena de ceros delante del número más corto para completar los dígitos de los dos números.
Además, el 0 completado es el carácter "0", no el número "0", lo cual también es un error.
Para la suma de dígitos, str3 se usa para matrices de caracteres y se recomienda usar objetos de cadena. El algoritmo es relativamente complicado de escribir, pero en realidad se puede simplificar:
La suma se calcula de menor a mayor. Cada vez que se suman str1 y str2 a los bits correspondientes de los números a y b respectivamente, se obtiene el resultado. es c.
El bit correspondiente de str3 es c%10 y el resultado se redondea a c/10.
Al final de cada cálculo, el valor de c se asigna a c/10. Si c no es cero y cuenta hasta el dígito más alto, str3 debe redondearse después del dígito más alto.
Al final del cálculo, encontrará que el orden de str3 está invertido, por lo que la salida debe estar en orden inverso para obtener el resultado correcto.
La implementación de referencia es la siguiente:
#include?
#include?
using?namespace?std;
int?main()?{
unsigned?long?c1,?c2;
cadena?str1,?str2;
cin?> >>str1 ?>>?str2;
c1?=?str1.length();
c2?=?str2.length();
/?Basado en El número de dígitos en la cadena más larga determina la longitud de las dos cadenas, y la cadena más corta se rellena con '0'
if(c1?>?c2){
str2? =?string(c1?-?c2, ?' 0')?+?str2;
}?else?{
str1?=?string( c2?-?c1 ,?' 0')?+?str1;
}
/?Calcule la longitud de los bits involucrados en el cálculo y tome el bit más largo p>
sin firmar ?long?calcLen?=?c1?>?c2c1?:?c2;
sin firmar?a,?b,?c?=?0;
string?str3;
unsigned?j?=?0;
/?Calcular la suma de cada bit
for(int?i?=? static_cast
//El i-ésimo dígito de str1
a?=?static_cast< unsigned?int>(str1[i]? -?48);
//El i-ésimo dígito de str2
b?=?static_cast< unsigned?int>(str2 [i]?-?48);
/?Agregue el primer dígito de str1 a str2 y agregue el redondeo c calculado previamente como un nuevo c
c?+=?a?+?b;
/?Calcular el i-ésimo dígito de str3
str3?+=?static_cast