Название, конечно, не по прогерскому фэншую, и вспоминается знаменитый стих столетней давности:
«We slog, slog, slog, slogging over Africa,
Boots, boots, boots, boots moving up and down again».
ПЕРВОЕ. Главный тормоз — дополнение строк нулями, которое квадратичное по скорости.
for i:=length(s1)+1 to m do
s1:='0'+s1;
for i:=length(s)+1 to m do
s:='0'+s;
Как решить?
function add1(const large,small:string):string;
function add(const x, y : string) : string;
begin
if length(x) > length(y)
then add := add1(x, y)
else add := add1(y, x);
end;
Ну и разумеется, сделать, чтобы add1 работала с числами разной длины.
ВТОРОЕ. У вас, по-видимому, ошибка — 99+1 = 100 не создаст третьего разряда.
ТРЕТЬЕ. Я не знаю, какой у вас Паскаль, но, вероятно, передача строк по const/var также повысила бы скорость.
ОФТОП. Если ваша задача не «ввести два числа, сложить и всё», я бы отделил длинное число от его строкового представления, примерно так.
TLongNum = record
length : integer;
data : array [1..1000] of byte;
end;