Главная
Дисциплины (2009-2010)
Дисциплины (2010-2011)
Разное
Популярные

Арифметические алгоритмы: умножение длинных натуральных десятичных чисел:

{ арифметические алгоритмы: умножение длинных натуральных десятичных чисел }
{ Введенное число помещается поразрядно в массив ROW.                      }
{ Могут умножаться числа до 10000 разрядов                                 }
{ ------------------------------------------------------------------------ }

{$A+, B-, D+, E+, F-, G+, I+, L+, N+, O-, P-, Q-, R-, S+, T-, V+, X+, Y+}
{$M 16384, 0, 655360}
uses crt;
var {-------- use calc factorial ---------}
    row        : array[1..20000] of byte;
    col        : array[1..10000] of byte;
    nr, nc, dp : integer;
    c          : char;

procedure PrintResult;
begin
     write('Р е з у л ь т а т = ');
     while (dp <= high(row)) do begin
        write(char(row[dp] + 48));
        inc(dp);
     end;
     writeln;
end;

{ Умножение по Аль-Хорезми, в ROW - 1 число, в COL - 2 число }
{ Результат пишется в конец массива ROW                      }
procedure Multiplying;
var i, j, cr, cc: integer;
    carry, sum: longint;
begin
    dp := high(row);
    cr := nr;
    cc := nc;
    carry := 0;
    while (cc > 0) do begin
        i := cr;
        j := cc;
        sum := carry;
        while (i <= nr) and (j >= 1) do begin
           sum := sum + row[i] * col[j];
           inc(i);
           dec(j);
        end;
        row[dp] := sum mod 10; dec(dp);
        carry := sum div 10;
        if cr > 1 then dec(cr) else dec(cc);
    end;
    while (carry <> 0) do begin
        row[dp] := carry mod 10;
        carry := carry div 10;
        dec(dp);
    end;
    inc(dp);
end;

begin
     { обнуление массивов-множителей }
     fillchar(row, sizeof(row), 0);
     fillchar(col, sizeof(col), 0);
     { поразрядный ввод 1-го числа }
     writeln('Введите 1-е число число:');
     c := #0;
     while NOT(c in ['0'..'9']) do c := readkey;
     nr := 0;
     while (c in ['0'..'9']) do begin
        write(c);
        inc(nr); row[nr] := ord(c) - 48;
        c := readkey;
     end;
     writeln;
     { поразрядный ввод 2-го числа }
     writeln('Введите 2-е число число:');
     while NOT(c in ['0'..'9']) do c := readkey;
     nc := 0;
     while (c in ['0'..'9']) do begin
        write(c);
        inc(nc);
        col[nc] := ord(c) - 48;
        c := readkey;
     end;
     writeln;
     { вызов процедуры умножения, затем - вызов процедуры вывода результата }
     Multiplying;
     PrintResult;
end.


Последнее обновление:
Copyright (C) 2009-2010 by RA0LHS
Hosted by uCoz