умножение

From
Anton Sokolov (2:467/81.38)
To
All
Date
2002-11-15T22:57:13Z
Area
RU.ALGORITHMS
#/▄▄▄▄▄/# · ···─═╗ Привет _All_ ! Пишет тебе *Anton* !
_*▀▀▀▀▀*_        ╚═══════════════─────────────────····· · · ·

Уважаемый _Алл_ Надо бы Написать две прогу (На Паскале),
а как их написать - ненаю :( посмотри, может чем поможешь ;)

--> Написать программу умножения больших чисел, используя метод квадрилатеро
катлеты.(Метод ентот заключается в следующем: на пример надо умножить
числа 12345 и 67891, мы записываем эти числа так:

               1   2   3   4   5
            1 \ 1 \ 2 \ 3 \ 4 \ 5
              0 \ 0 \ 0 \ 0 \ 0 \ 5
            9 \ 9 \ 8 \ 7 \ 6 \ 5
              0 \ 1 \ 2 \ 3 \ 4 \ 9
            8 \ 8 \ 6 \ 4 \ 2 \ 0
              0 \ 1 \ 2 \ 3 \ 4 \ 3
            7 \ 7 \ 4 \ 1 \ 8 \ 5
              0 \ 1 \ 2 \ 2 \ 3 \ 4
            6 \ 6 \ 2 \ 8 \ 4 \ 0
              0 \ 1 \ 1 \ 2 \ 3 \ 1
               0   8   3   8   1

Т.е. На верху числа написаны - слева на право, а сбоку - снизу вверх.
(удобней делать на клечатой бумаге, но я пологаю, разберешся)
Затем проводим диагоНали (как показано на рисунке). Начинаем умножение,
начиная с любой цифры множимого на любую цифру множителя. Получающееся
произведение, которое чвляется двузначным числом, следует вписать в
соответствующий квадратик так, чтобы цифра десятков стояла в левом отделеНии
квадратика, а цифра единия - в правом. Когда все клетки окажутся
заполненными, остается произвести сложение по направлению диагоналей.
Произведение читается слева направо и вверх.
В нашем случае ответ: 12345 * 67891 = 838114395   )
Что моих идей, то были какие то задумки, вот,
посмитри, может посмеёшься на досуге ...
==============Начало_проги===========================================
program umnigen;

uses crt;
const n=5;
var a,b:string;
    c,d:array [1..n] of 0 .. 9;
    e:string[10];
    f:array [1..2*n] of 0 .. 9;
    g:array [1..2*n, 1..n] of 0 .. 9;
    g1:array [1..2*n, 1..2*n] of 0 .. 9;
    h:array [1..n,1..n] of byte;

    p,r:byte;
    i,j,k,l:word;
begin
clrscr;
writeln('Введите 1-е число ...');
{for i:=1 to n do read(a[i]);}
writeln;
readln(a);
{for i:=1 to n do a[i]:=i*a[i];}
writeln('Введите 2-е число ...');
writeln;
readln(b);
(*вычисление длинны чисел*)
p:=length(a); r:=length(b);
(*"преобразование" введенных чисел, которые пока строки
в одномерные массивы*)
e[1]:='0';
e[2]:='1';
e[3]:='2';
e[4]:='3';
e[5]:='4';
e[6]:='5';
e[7]:='6';
e[8]:='7';
e[9]:='8';
e[10]:='9';

for i:=1 to 10 do
for j:=1 to n do
if a[j]=e[i] then c[j]:=i-1;

for i:=1 to 10 do
for j:=1 to n do
if b[j]=e[i] then d[j]:=i-1;
(* c и d - это одномеpные массивы, 'являющиеся' нашими числами *)


(* алгоpитм умножения :) *)
(* постpоение матpицы умножения *)

for i:=1 to n do
for j:=1 to n do h[n+1-i,j]:=c[i]*d[j];

for i:=1 to n do
for j:=1 to n do begin
g[2*i,j]:=h[i,j] div 10;
g[2*i-1,j]:=h[i,j] mod 10; end;

for i:=1 to 2*n do
for j:=1 to 2*n do begin
g1[2*i,2*j]:=h[i,j] div 10;
g1[2*i-1,2*j]:=h[i,j] mod 10; end;

(* конец алгоpитма умножения ... *)

(* тепеpь начинается беда %(*)
writeln(p,'   ',a);
{for i:=1 to n do writeln(a[i]+2);}
writeln(r,'   ',b);

{for i:=1 to n do writeln(e[i]);}
writeln;
for i:=1 to n do write(c[i]);
writeln;
for i:=1 to n do write(d[i]);
writeln;
for k:=1 to n do begin
for l:=1 to n do write(h[k,l]:2,' '); writeln;
end;

writeln;
for k:=1 to 2*n do begin
for l:=1 to n do write(g[k,l]:2,' '); writeln;
end;

writeln;
for k:=1 to 2*n do begin
for l:=1 to 2*n do write(g1[k,l]:2,' '); writeln;
end;

end.
================КоНец_проги=========================================

Как видно, основная сложность возникает пpи суммиpовании "полученных
пpоизведений" - получении цифp пpоизведения :(

               · ···─═╗ Ну я вроде все сказал... Bye _*All*_ !
                      ╚═══════════════─────────────────····· · · ·
... Машы рулят %)
--- GoldEd 3.0.1-asa9 SR3 & Fido Master 2000
 * Origin: Поздравляем! Вы прошли Windows! Начать новую игру? (2:467/81.38)