Сложение очень длинных целых чисел

Задача: 

Вводятся два очень длинных целых числа. Найти их сумму.

Описание переменных: 
  • s1, s2, s3 - строковые представления первого, второго числа и их суммы;
  • n1, n2, n3 - текущие разряды первого и второго чисел и перенос из предыдущего разряда;
  • l1, l2 - длины введенных строк из чисел;
  • c - строковое представление суммы текущих разрядов.
Алгоритм решения задачи: 

Под "очень длинными целыми числами" здесь подразумеваются такие, которые не помещаются даже в тип данных longint.

Вводятся два числа, которые записываются в программу как строки. Измеряется длина строк. В случае, если первая строка длиннее второй, переменные обмениваются значениями. Это делается для избежания сложностей в дальнейшем.

В цикле символы строки s1 перебираются с конца до первого (счетчик i). Каждый символ преобразуется в целое число. Также с конца берутся символы s2 (счетчиком служит l2) и преобразуются в целое. Числа складываются. Сумма записывается в начало строки s3 без старшего разряда, который сохраняется в отдельной переменной n3 и добавляется к сумме при следующем сложении разрядов.

Когда строка s1 заканчивается, надо проверить есть ли перенос из младшего разряда. Если есть, то надо продолжать складывать, пока перенос не станет равным нулю.

После того, как складывать уже нечего, надо дописать впереди s3 оставшуюся часть s2.

Программа на языке Паскаль: 

var 
    s1, s2, s3: string;
    n1, n2, n3, l1, l2, i: byte;
    c: string[1];
begin
    readln(s1);
    readln(s2);
    l1 := length(s1);
    l2 := length(s2);
    if l1 > l2 then begin
        s3 := s1; l3 := l1;
        s1 := s2; l1 := l2;
        s2 := s3; l2 := l3
    end;
    s3 := ''; n3 := 0;
    for i := l1 downto 1 do begin
        val(s1[i],n1);
        val(s2[l2],n2); l2 := l2 - 1;
        str((n1+n2+n3) mod 10,c);
        s3 := c + s3;
        if n1+n2+n3 > 9 then n3:=1
        else n3 := 0;       
    end;
    while n3 = 1 do begin
        if l2 <> 0 then begin
            val(s2[l2],n2); l2 := l2 - 1;
            str((n2+n3) mod 10,c);
            s3 := c + s3;
            if n2+n3 < 10 then n3:=0;
        end
        else begin
            s3 := '1' + s3;
            n3 := 0;
        end;
    end;
    if l2 <> 0 then
        s3 := copy(s2,1,l2) + s3;
    writeln(s3);
end.

Пример выполнения программы:

1084533577231231
4549920233
1084538127151464

Комментарии

Вводятся два очень длинных целых числа. Найти их сумму.

в данной программе откуда появилась переменная l3?
при запуске программа выдает ошибку в строке val(s1[i],n1)
помогите исправить ошибки!