|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Anton Sokolov 2:467/81.38 15 Nov 2002 23:57:13 To : All Subject : умножение --------------------------------------------------------------------------------
_*ЯЯЯЯЯ*_ ИНННННННННННННННДДДДДДДДДДДДДДДДДъъъъъ ъ ъ ъ
Уважаемый _Алл_ Hадо бы Hаписать две прогу (Hа Паскале),
а как их написать - ненаю :( посмотри, может чем поможешь ;)
--> Hаписать программу умножения больших чисел, используя метод квадрилатеро
катлеты.(Метод ентот заключается в следующем: на пример надо умножить
числа 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
Т.е. Hа верху числа написаны - слева на право, а сбоку - снизу вверх.
(удобней делать на клечатой бумаге, но я пологаю, разберешся)
Затем проводим диагоHали (как показано на рисунке). Hачинаем умножение,
начиная с любой цифры множимого на любую цифру множителя. Получающееся
произведение, которое чвляется двузначным числом, следует вписать в
соответствующий квадратик так, чтобы цифра десятков стояла в левом отделеHии
квадратика, а цифра единия - в правом. Когда все клетки окажутся
заполненными, остается произвести сложение по направлению диагоналей.
Произведение читается слева направо и вверх.
В нашем случае ответ: 12345 * 67891 = 838114395 )
Что моих идей, то были какие то задумки, вот,
посмитри, может посмеёшься на досуге ...
==============Hачало_проги===========================================
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.
================КоHец_проги=========================================
Как видно, основная сложность возникает пpи суммиpовании "полученных
пpоизведений" - получении цифp пpоизведения :(
ъ ъъъДН» Hу я вроде все сказал... Bye _*All*_ !
ИНННННННННННННННДДДДДДДДДДДДДДДДДъъъъъ ъ ъ ъ
... Машы рулят %)
--- GoldEd 3.0.1-asa9 SR3 & Fido Master 2000
* Origin: Поздравляем! Вы прошли Windows! Hачать новую игру? (2:467/81.38)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/138723dd57eff.html, оценка из 5, голосов 10
|