Cô giao bài khó quá mình chả hiểu gì mong mn giúp mình vứi ạ. Nhập vào hai xâu s1 và s2 (số nguyên) tính tổng của hai xâu không giới hạn số lượng độ dài của xâu

1 câu trả lời

Chỉ xử lý số dương:

uses crt;
type bignum = ansistring;
var a, b:bignum;
    i:longint;

function add(a, b:bignum):bignum;
var ans:bignum;
    rem, i, tmp:longint;
begin
    rem:=0; ans:='';
    while length(a) < length(b) do a:='0' + a;
    while length(b) < length(a) do b:='0' + b;
    for i:=length(a) downto 1 do
        begin
            tmp:=ord(a[i]) + ord(b[i]) - 96 + rem;
            rem:=tmp div 10;
            tmp:=tmp mod 10;
            ans:=chr(tmp + 48) + ans;
        end;
    if rem = 1 then ans:='1' + ans;
    exit(ans);
end;

begin
    clrscr;
    readln(a);
    readln(b);
    
    writeln(add(a, b));
end.

Xử lí cả số âm:

uses crt;
type bignum = ansistring;
var a, b:bignum;
    i:longint;

procedure swap(var a, b:bignum);
var tmp:bignum;
begin   
    tmp:=a; a:=b; b:=tmp;
end;

function cmp(a, b:bignum):boolean;
begin
    if length(a) = length(b) then
        exit(a < b);
    exit(length(a) < length(b));
end;

function type1(a, b:bignum):bignum;
var ans:bignum;
    rem, i, tmp:longint;
    neg:boolean;
begin
    neg:=false;
    if (a[1] = '-') then
        begin
            neg:=true;
            delete(a, 1, 1);
            delete(b, 1, 1);
        end;
    rem:=0; ans:='';
    while length(a) < length(b) do a:='0' + a;
    while length(b) < length(a) do b:='0' + b;
    for i:=length(a) downto 1 do
        begin
            tmp:=ord(a[i]) + ord(b[i]) - 96 + rem;
            rem:=tmp div 10;
            tmp:=tmp mod 10;
            ans:=chr(tmp + 48) + ans;
        end;
    if rem = 1 then ans:='1' + ans;
    if neg then ans:='-' + ans;
    exit(ans);
end;

function sub(a, b:bignum):bignum;
var ans:bignum;
    tmp, rem, i:longint;
    neg:boolean;
begin
    ans:=''; rem:=0;
    while length(a) < length(b) do a:='0' + a;
    while length(b) < length(a) do b:='0' + b;
    for i:=length(a) downto 1 do
        begin   
            tmp:=ord(a[i]) - ord(b[i]) - rem;
            if tmp < 0 then
                begin
                    rem:=1;
                    tmp:=tmp + 10;
                end;
            ans:=chr(tmp + 48) + ans;
        end;
    while (length(ans) > 1) and (ans[1] = '0') do delete(ans, 1, 1);
    exit(ans);
end;
    
function type2(a, b:bignum):bignum;
var ans:bignum;
    neg:boolean;
begin
    if a[1] = '-' then swap(a, b);
    delete(b, 1, 1);
    if cmp(a, b) then neg:=true else neg:=false;
    if neg then swap(a, b);
    ans:=sub(a, b);
    if neg then ans:='-' + ans;
    exit(ans);
end;
    

function inc(var a:bignum; b:bignum):bignum;
begin
    if ((a[1] = '-') and (b[1] = '-') or ((a[1] <> '-') and (b[1] <> '-'))) then
        a:=type1(a, b)
    else
        a:=type2(a, b);
    exit(a);
end;

begin
    clrscr;
    readln(a);
    readln(b);
    
    inc(a, b);
    writeln(a);
end.

Câu hỏi trong lớp Xem thêm