¿Necesariamente debe hacerse con strings?
Es que me parece algo absolutamente aparatoso, ya que nos condiciona a hacer conversiones entre cadenas (strings) y números:
Cadena -> Numéro -> Cadena
Yo lo encararía directamente como un array numérico. Es decir,
Type
TBigNumber30 = array[1..30] of integer;
De modo que las operaciones pueden hacerse con menos dificultad y lo más "pesado" ahora sería como mostrar dicho número en pantalla.
var
Nro1, Nro2, Nro3: TBigNumber30;
Por ejemplo, sumar la unidad:
Nro3[30] = nro1[30] + Nro2[30];
Ahora bien, esto no es lo deseable, como se aprecia... cada posición es un integer y no nos sirve de nada. En realidad necesitamos llevar el acarreo hacia la siguiente cifra, y así hasta llegar al final. La pregunta aquí es ¿Cómo sacamos el acarreo? Hay que repasar un poquito las clases de primaria
Por empezar debemos hacer una corrección, en lugar de integer diseñemos un tipo especial:
Type
TDecimal = 0..9;
TBigNumber30 = array[1..30] of TDecimal;
Volvamos al tema del acarreo, ¿Cuándo se da el caso? Cuando la suma de ambos dígitos es 9. Por ejemplo, 8 + 7 = 15. El acarreo es 1, que se debe sumar a la "siguiente" (a la posición anterior según el array) cifra. En la posición actual queda el 5.
Entonces para toda cifra debemos seguir esta lógica:
Nro3[pos] := AcarreoPrevio + Nro1[pos] + Nro2[pos];
No todo está dicho, pero creo que con ello ya la deberías ir pillando.
Claramente se vé en el ejemplo anterior que necesita cierta correción. ¿Adivinas cual?
Ahora bien, esto mismo se puede hacer con los strings. Sabiendo que un strings puede ser tratado como un vector, podemos ir recorriendo desde Length() hasta 1 haciendo las conversiones y operaciones necesarias.
Espero haberme explicado.
Saludos,