Ученический проект "НОД для сверхбольших чисел"
проект по информатике и икт (10 класс)

Существуют  числа, которые невозможно описать просто переменной  числового типа  начиная с  byte и заканчивая  extended и, следовательно, встроенные арифметические  функции для них применить нельзя.

Данная программа  содержит в себе набор функций,  дающих  возможность обрабатывать числа, которые можно было бы назвать сверхбольшими, или сверхмалыми,  т.е. те,  количество знаков которых  может  превышать несколько сотен.

Все функции реализованы только для положительных и целых чисел, но переписать все для дробных  просто, если принять во внимание тот факт, что  дробное число – это два целых, разделенных точкой. Такая расширенная реализация будет нашим следующим шагом.

 

Скачать:

ВложениеРазмер
Microsoft Office document icon sverhbolshie_i_sverhmalye_chisla-proekt1.doc141.5 КБ

Предварительный просмотр:

Секция: Информатика и вычислительная техника.

Программное обеспечение и компьютерная техника

НОД для сверхбольших и сверхмалых чисел. Длинная арифметика.

                                                                                        АВТОРЫ:

                                                                                       Архипов Александр Александрович,

                                                                                       ученик 10 «А» класса МБОУ лицей №4

                                                                                       Шкуро Вадим Александрович,

                                                                                       ученик 10 «А» класса МБОУ Лицей №4

                                                                                       

                                                                                       

                                                                     РУКОВОДИТЕЛЬ:

                                                                                       Середа Елена Ивановна,

                                                                                       учитель информатики  МБОУ Лицей №4

                                                             

г. Чехов 2018 г.


Содержание:

1. Краткая аннотация   …………………………..…………………………..........................3

2. Аннотация …………………………………………………………………………………4

3. Основная часть

3.1.  Общий алгоритм работы…….………………………………………………………….6

3.2. Блок – схема  алгоритма вычитания…………………………………………………….7

3.3. Блок – схема алгоритма сложения…...………………………………………………….8

3.4. Алгоритмы умножения, деления, выделения остатка ………………………………...9

4. Приложение …………………………...………………………………………..…………12

 

Программа на языке  Delphi…………………………………………………..……………..12

5. Список литературы ………………………………………………………………………..23

НОД для сверхбольших чисел. Длинная арифметика

Архипов Александр Александрович, ученик 10 класса, Шкуро Вадим Александрович, ученик 10 класса.

Московская область Чеховский район г. Чехов, муниципальное общеобразоательное бюджетное общеобразовательное учреждение «Лицей№4»

Краткая аннотация

Существуют  числа, которые невозможно описать просто переменной  числового типа  начиная с  byte и заканчивая  extended и, следовательно, встроенные арифметические  функции для них применить нельзя.

Данная программа  содержит в себе набор функций,  дающих  возможность обрабатывать числа, которые можно было бы назвать сверхбольшими, или сверхмалыми,  т.е. те,  количество знаков которых  может  превышать несколько сотен.

Все функции реализованы только для положительных и целых чисел, но переписать все для дробных  просто, если принять во внимание тот факт, что  дробное число – это два целых, разделенных точкой. Такая расширенная реализация будет нашим следующим шагом.

НОД для сверхбольших и сверхмалых  чисел. Длинная арифметика

Архипов Александр Алексадрович,   Шкуро Вадим Александрович,  Московская область, Чеховский район, г.Чехов, муниципальное бюджетное общеобразовательное учреждение  «Лицей №4»

АННОТАЦИЯ

Известно, что  переменные в программировании играют очень важную роль, ведь они служат для хранения  и обработки данных. Переменная в программе представлена  именем и значением. Причем тип данных, которые могут быть значениями переменных, определяют  тип используемых переменных. Например, значениями числовых переменных (Byte, Integer, Long,..) являются целые числа. Так вот, исследуя свойства числовых переменных, мы обнаружили, что самое большое значение, которое может хранить в себе переменная числового типа, не превышает 64 знаков. Но ведь существуют гораздо большие числа! Например, при работе  криптоалгоритмов используются числа со значениями в сотни и даже тысячи знаков. Интересная область применения больших чисел - это работа с числами повышенной точности. Представление чисел с плавающей точкой неточно, ошибки накапливаются. Так возникла идея создания нашего проекта.

Цель: найти способ,  дающий возможность хранить в памяти и обрабатывать числа, которые можно было бы назвать сверхбольшими, или сверхмалыми,  т.е. те,  количество знаков которых  может  превышать несколько сотен.

Для  достижения поставленной цели  необходимо решить следующие задачи:

  1. Изучить приемы программирования  на языке  Delphi
  2. Подобрать и изучить литературу по теме многоразрядные числа, области их применения.
  3. Используя знания по теме  «Нахождение наибольшего общего делителя» составить  на языке Delphi программу «Нахождение НОД для сверхбольших и сверхмалых чисел»
  4. Дать рекомендации по применению данной программы.

В ходе работы  пришлось столкнуться с  недостатком описания  в литературе алгоритмов работы с многоразрядными числами,  сводящихся в основном к   реализации операций сложения, вычитания и умножения большого числа на маленькое, поэтому большая часть нашей работы строится на нашем понимании данного вопроса.

Предложенный алгоритм является плодом  собственных представлений о том, как можно обработать на компьютере  число с большим количеством разрядов.

Работа состояла из  нескольких этапов:

  1. разработка блок – схемы основной программы и процедур
  2. написание и  отладка программы.

Представленная программа реализована  на языке  Delphi и  демонстрирует возможность нахождения НОД для сверхбольших и сверхмалых чисел, а также некоторые арифметические операции для этих чисел.

Данный алгоритм может быть использован при изучении программирования на языках высокого уровня, а также при  проведении точных расчетов с числами, количество знаков в которых более 50, т.е.   при  построении криптоалгоритмов, в астрономии и т.п.


3. Описание работы.

3.1 Общий алгоритм работы.

  1. Начало

  1. Вводим  данные в  переменные строкового типа

  1. Выбираем  действие (НОД, сложение,

                                      вычитание,..) и вызываем соответствующую

процедуру обработки

3.2.  Блок – схема алгоритма вычитания

  Помещаем цифры в числовые массивы  e и f

 Находим длину числового массива  - j

j >=1

e [ j ] > = f [ j ]

                                                                                                                     

e [ j ] : = e [ j ] + 10

e [ j – 1 ] : = e [ j – 1 ] - 1

e [ j ] : = e [ j ] – f [ j ]

j : = j – 1

3.3. Блок – схема алгоритма сложения

                                                                                                                                                                                                                                                                                                                                

3.4 Алгоритмы  операций  над целыми сверхбольшими числами.

Вводное замечание: все числа будут храниться в переменных типа String.  Итак, нужны базовые операции математики:

1.       Сравнение чисел

2.       Сложение чисел

3.       Вычитание чисел

4.       Умножение чисел

5.       Деление чисел

6.       Нахождение остатка от деления ( на нем основано нахождение НОД)

 Сравнение: 

N1, N2 – два числа.

1.       Если длины чисел не равны, то больше то число, чья длина больше. Это элементарно.

2.       Остаётся случай, когда длины чисел равны:

a.       N1=N2  - опять все в порядке

b.       Иначе: поочерёдно сравниваем разряды обоих чисел начиная со старшего и двигаясь в направлении к младшему. При первом же несоответствии разрядов, большим признаём то число, чей разряд оказался большим.

Этот метод хорошо реализуется с помощью массива. Размерность массива равна длине наибольшего из суммируемых чисел. Ещё одна проблема, которую надо решить: преобразование массива в String. 

Сложение:

 Вспомним школьную программу: самое простое – сложить два числа столбиком. Реализуем немного усовершенствованный алгоритм такого сложения

 1.  Меньшее по длине число дополним нулями слева (до длины большего по длине числа – возможно не очень хорошее решение, зато не надо возиться с пересчётом адресов в массиве). Выписываем  первое число по разрядам.

2.  К этому числу поразрядно прибавим второе:

 3.  Нормализуем сумму поразрядно: будем двигаться от младшего к старшему разряду. На каждом шаге: если текущий разряд больше 9, то следующий разряд увеличиваем на 1, текущий уменьшаем на 10. Если в конце в памяти останется 1, то значит, что в числе появился новый разряд, и мы должны в начало результата дописать 1:

Вычитание: 

Алгоритм очень похож на суммирование. Но есть несколько небольших отличий

1. Меньшее по длине число дополним нулями слева.

2. От этого числа поразрядно отнимем второе:

3. Нормализуем результат поразрядно: будем двигаться от младшего к старшему разряду. На каждом шаге: если разность возможна , то эту разность записываем в текущий разряд, иначе  в текущий разряд добавляем  10, а предыдущий уменьшаем на 1.

 4.  Теперь остаётся лишь убрать лишние нули из левой части результата. 

При реализации следует помнить, что если N1=N2, то мы получим одни нули, и в пункте 4 нужно будет оставить 1 ноль. Это и будет результатом.

Умножение 

Как будем умножать? Ну, конечно в столбик, по школярски!

1.       Стандартно: дополним меньшее по длине число нулями слева.

2.       Возьмём 2*длину числа нулевых ячеек. Умножаем на 2 т.к. при умножении мы можем получить новые разряды в количестве от 0 до длины в два раза большей.      

3.       Двигаемся по второму числу начиная с младшего разряда к старшему

4.       Произведение выбранных разрядов прибавляем к значению ячейки с адресом, равным сумме номеров выбранных разрядов. Если результат в данной ячейке больше 9, то предыдущую увеличиваем на число, равное целой части от деления этого результата на 10, а в данной ячейке оставляем число, равное остатку от деления на 10 того же результата.

5.       Идём на шаг 4

6.       Идём на шаг 3

Деление

         При делении нам надо найти целую часть и остаток. Остаток находится с помощью  функции  MOD  (смотрите алгоритм ниже). Если в этом алгоритме каждый раз подсчитывать количество нулей дописываемых ко второму числу и брать во внимание число, на которое умножается массив, то тем самым легко получить целую часть.

Нахождение остатка от деления

С этим алгоритмом пришлось изрядно повозиться из-за того, что операция Mod практически нигде не описана. Опять вспоминаем математику:

A mod A=0        

A mod 1=0

A mod B=C означает, что существует такое положительное целое число K, что B*K+C=A. C нам надо найти. Что ж, существует очень простой способ: отнимать от A число B до тех пор, пока A>=B. В итоге получим C. Но представьте только, сколько операций вычитания придётся сделать при больших числах!!! Надо как-то оптимизировать вычитание. До сих пор мы не использовали число K. Каким оно может быть? K может быть разложено на произведение чисел. Чем оптимальнее будут выбраны эти числа, тем лучше! Самое лучшее решение, что приходит в голову: выбирать K поразрядно (по степеням 10). Протестируем идею - рассмотрим пару примеров:

1.       1234 mod 7=2

2.       1237 mod 70=44           44 mod 7=2

3.       1237 mod 700=534       534 mod 70=44                     44 mod 7=2

 Значит, мы можем варьировать значением числа K~B (с определёнными условиями)!

Воплощаем мысль в алгоритм:

 1.       Откинем все частные случаи и тогда получим, что: A>B

2.       Итак, если A>B:

3.       Будем умножать B на 10 до тех пор, пока длины чисел A и B не сравняются.

4.       Если A=B, то mod=0

5.       Если A делим B на 10

6.       Поочерёдно умножаем B на i=1,2,3,… пока B не станет больше A

7.       Берём предыдущее число (i), на которое было умножено B, и выполняем A=A-B*i

8.       Идём на шаг 2

9.       Результат=A


5. ПРИЛОЖЕНИЕ

Программа на языке  Delphi

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls, Menus, ComCtrls, jpeg;

type

  TForm1 = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    Image1: TImage;

    Label3: TLabel;

    Label2: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Label8: TLabel;

    Button5: TButton;

    Button6: TButton;

    Label9: TLabel;

    Label10: TLabel;

    Label11: TLabel;

    Edit3: TEdit;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure Edit1Change(Sender: TObject);

    procedure Edit2Change(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure FormActivate(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Image1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

uses Unit2, Unit3, Unit6;

{$R *.dfm}

   { Функция сравнения }

 function bolshee(c1,c2:string):string;

var i:integer;

label mmm;

begin

if length(c1)>length(c2) then begin bolshee:=c1; goto mmm; end

 else if length(c2)>length(c1) then begin bolshee:=c2; goto mmm; end;

 for i:=1 to length(c1) do begin

if strtoint(c1[i])

                  bolshee:=c2; break;

                  end else if c1[i]>c2[i] then begin bolshee:=c1; break; end;

end;

mmm:

end;

 function vic1(c1,c2:string):string;

   var j:longint;

        dl:longint;

    a,b:array[1..600] of integer;{Размер массива можно задать и больше. чем 600}

    label 123;

begin

if c1=c2 then begin vic1:='0'; goto 123; end;

if length(c1)>length(c2) then

        repeat c2:='0'+c2 until length(c1)=length(c2)

else

        while length(c1)<>Length(c2) do c1:='0'+c1;

for j:=1 to length(c1) do a[j]:=strtoint(c1[j]);

for j:=1 to length(c2) do b[j]:=strtoint(c2[j]);

j:=length(c1);

While j>=1 do begin

    if a[j]>=b[j] then a[j]:=a[j]-b[j]

     else begin

             a[j]:=a[j]+10;

             a[j-1]:=a[j-1]-1;

             a[j]:=a[j]-b[j];

          end; j:=j-1;

                    end;

dl:=length(c1);

c1:='';

for j:=1 to dl do c1:=c1+(inttostr(a[j]));

while c1[1]='0' do delete(c1,1,1);

vic1:=c1;

123:

end;

{Функция умножения}

Function umnoz(c1,c2:string):string;

var i,dl,j:integer;

    a,b,rez:array[1..600] of integer;

    pr,z:string;

begin

if c2=bolshee(c1,c2) then begin

                          z:=c1;

                          c1:=c2;

                          c2:=z; end;

dl:=length(c1);

if length(c1)>length(c2) then

        repeat c2:='0'+c2 until length(c1)=length(c2)

else

        while length(c1)<>Length(c2) do c1:='0'+c1;

for i:=1 to length(c1) do begin

a[i]:=strtoint(c1[i]);

b[i]:=strtoint(c2[i]);    end;

for i:=1 to 600 do rez[i]:=0;

for i:=dl downto 1 do    begin

  for j:=dl downto 1 do  begin

    rez[i+j]:=rez[i+j]+(a[j]*b[i]);

    if rez[i+j]>9 then begin rez[i+j-1]:=rez[i+j-1]+(rez[i+j] div 10);

                             rez[i+j]:=rez[i+j] mod 10;

    end; end; end;

pr:='';

for i:=1 to (2*dl) do pr:=pr+inttostr(rez[i]);

while pr[1]='0' do delete(pr,1,1);

umnoz:=pr;

end;

{Процедура вычитания}

procedure vic(var m,n:string);

   var j:longint;

        dl1,dl2:longint;

    e,f:array[1..600] of integer;

begin

for j:=1 to length(m) do e[j]:=strtoint(m[j]);

for j:=1 to length(n) do f[j]:=strtoint(n[j]);

j:=length(m);

While j>=1 do begin

    if e[j]>=f[j] then e[j]:=e[j]-f[j]

     else begin

             e[j]:=e[j]+10;

             e[j-1]:=e[j-1]-1;

             e[j]:=e[j]-f[j];

          end; j:=j-1;

                    end;

dl1:=length(m);

dl2:=length(n);

m:='';

n:='';

for j:=1 to dl1 do m:=m+(inttostr(e[j]));

for j:=1 to dl2 do n:=n+(inttostr(f[j]));

end;

function ost(c1,c2:string):string;

var m,n,k,des:string; b1:string; u,v:string; i:integer;

label kon;

begin

m:=c1;

n:=c2;

if n=bolshee(m,n) then begin m:=vic1(n,m); goto kon; end;

if m=n then begin  m:='0'; goto kon; end;

des:='10';

while m=bolshee(m,n) do begin

b1:=n;

while length(m)<>length(b1) do  b1:=umnoz(b1,des);

if b1=bolshee(m,b1) then delete(b1,length(b1),1);

k:=b1; i:=1;

while m=bolshee(m,k) do begin

i:=i+1;

k:=umnoz(b1,inttostr(i));

if k=m then begin m:='0'; goto kon; end;

end;

i:=i-1;

if i=0 then begin m:=vic1(m,b1); goto kon; end;

k:=umnoz(b1,inttostr(i));

m:=vic1(m,k);

end;

kon:

ost:=m;

end;

      {Процедура для подсчета НОД }

procedure TForm1.Button1Click(Sender: TObject);

var aa,bb,vs:string;  dl:integer;

begin

label9.caption:='';

edit3.text:='';

label4.Caption:='';

aa:=edit1.Text;

bb:=edit2.Text;

 if (aa[1]='0') and (bb[1]='0') then begin

    delete(aa,1,2);

    delete(bb,1,2);

    while aa[1]='0' do delete(aa,1,1);

    while bb[1]='0' do delete(bb,1,1);

    if length(aa)

    repeat aa:=aa+'0' until length(aa)=length(bb);

    if length(aa)>length(bb) then

    repeat bb:=bb+'0' until length(aa)=length(bb);

                           end;

if bb=bolshee(aa,bb) then begin

                       vs:=aa;

                       aa:=bb;

                       bb:=vs;

                       end;

while bb<>'0' do

   begin vs:=ost(aa,bb);

   aa:=bb;

   bb:=vs;

   end;

 edit3.text:=aa;

label4.Caption:='Наибольший общий делитель этих чисел равен';

  label10.Caption:='цифр в результате - '+ inttostr(length(aa));

end;

     {Очистка}

procedure TForm1.Button2Click(Sender: TObject);

begin

label9.caption:='';

edit1.Text:='';

edit2.Text:='';

edit3.text:='';

label4.Caption:='';

label10.Caption:='';

label11.Caption:='';

end;

  {Здесь мы сейчас подсчитаем разность двух чисел}

procedure TForm1.Button4Click(Sender: TObject);

var c,z:string;

    i:longint;

    ss:boolean;

    dl1,dl:integer;

    vs:string;

label mmm,qqq;

begin

label9.Caption:='';

edit3.text:='';

 label4.Caption:='';

c:=edit1.Text;

z:=edit2.Text;

if c[1]='-' then  delete(c,1,1);

if z[1]='-' then  delete(z,1,1);

                    ss:=false;

if (c[1]='0') and (z[1]='0') then begin

    dl1:=length(c);

    ss:=true;

    if length(c)

    repeat c:=c+'0' until length(c)=length(z);

    if length(c)>length(z) then

    repeat z:=z+'0' until length(c)=length(z);

        repeat delete(c,1,1)

    until (c[1]<>'0') and (c[1]<>'.') and (c[1]<>',');

   repeat delete(z,1,1)

    until (z[1]<>'0') and (z[1]<>'.') and (z[1]<>',');

     end;

  if c=z then  begin c:='0'; goto mmm; end;

    if length(c)

            vs:=c;

            c:=z;

            z:=vs;   end;

 if length(c)>length(z) then begin repeat

                z:='0'+z;

             until length(c)=length(z); goto qqq; end;

for i:=1 to length(c) do begin

if strtoint(c[i])

                  vs:=c;

                  c:=z;

                  z:=vs; break;

                  end else if c[i]>z[i] then break;

end;

qqq: vic(c,z);

while c[1]='0' do delete(c,1,1);

if ss=true then begin while (dl1-2)>length(c) do c:='0'+c;

c:='0,'+c;

end;

        dl:=length(c);

if ss=true then    while c[dl]='0' do

   delete(c,dl,1);

mmm: edit3.text:=c;

     label4.Caption:='разность этих чисел равна ';

     label10.Caption:='цифр в результате - '+inttostr(length(c));

end;

 {Здесь счиается сумма}

procedure TForm1.Button3Click(Sender: TObject);

var c,z:string;

    i,dl,dl1,dc:integer;

    a,b:array[1..600] of integer;

    ss:boolean;

begin

label9.Caption:='';

edit3.text:='';

c:=edit1.Text;

z:=edit2.Text;

ss:=false;

if (c[1]='0') and (z[1]='0') then begin

    dl1:=length(c)-2;

    ss:=true;

    if length(c)

    repeat c:=c+'0' until length(c)=length(z);

    if length(c)>length(z) then

    repeat z:=z+'0' until length(c)=length(z);

     dc:=length(c);

    delete(c,1,2);

    delete(z,1,2);

    end;

if length(c)>length(z) then

        repeat z:='0'+z until length(c)=length(z)

else

        while length(c)<>Length(z) do c:='0'+c;

for i:=1 to length(c) do begin

a[i]:=strtoint(c[i]);

b[i]:=strtoint(z[i]);    end;

for i:=length(c) downto 2 do

if (a[i]+b[i])>=10 then

                  begin a[i]:=((a[i]+b[i]) mod 10);

                        a[i-1]:=a[i-1]+1; end

else a[i]:=a[i]+b[i];

a[1]:=a[1]+b[1];

dl:=length(c);

c:='';

for i:=1 to dl do

c:=c+(inttostr(a[i]));

if ss=true then begin

                if length(c)>dl1 then begin

                                      delete(c,1,1);

                                      c:='0,'+c;

                                      end

                else c:='0,'+c;

    dl:=length(c);

 if ss=true then   while c[dl]='0' do

   delete(c,dl,1);           end;

                edit3.text:=c;

label4.caption:='сумма этих двух чисел равна: ';

 label10.Caption:='цифр в результате - ' + inttostr(length(c));

end;

procedure TForm1.N2Click(Sender: TObject);

begin

CLOSE

end;

procedure TForm1.N4Click(Sender: TObject);

begin

Form2.ShowModal;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

Form3.ShowModal;

end;

procedure TForm1.Edit1Change(Sender: TObject);

begin

label5.Caption:=inttostr(length(edit1.Text));

end;

procedure TForm1.Edit2Change(Sender: TObject);

begin

      label6.Caption:=inttostr(length(edit2.Text));

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Var I:Integer;

begin

for i:=(255 div 5) downto 0 do

begin

AlphaBlendValue:=i*5;

Application.ProcessMessages;

end;

DeleteFile('1.wav');

form6.close;

end;

Var T:Boolean;

procedure TForm1.FormActivate(Sender: TObject);

Var I:Integer;

begin

if t then

for i:=0 to 255 div 5 do

begin

AlphaBlendValue:=i*5;

Application.ProcessMessages;

end;

t:=False;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

T:=True;

end;

     {Данная процедура служит для умножения наших чисел}

procedure TForm1.Button5Click(Sender: TObject);

 var c,z,kl:string;

    i,dl,j:integer;

    a,b,rez:array[1..600] of integer;

begin

label9.caption:='';

edit3.text:='';

c:=edit1.Text;

z:=edit2.Text;

if z=bolshee(c,z) then begin

                       kl:=c;                        c:=z;                         z:=kl;

                       end;   dl:=length(c);

if length(c)>length(z) then

        repeat z:='0'+z until length(c)=length(z)

else

        while length(c)<>Length(z) do c:='0'+c;

for i:=1 to length(z) do begin

a[i]:=strtoint(c[i]);

b[i]:=strtoint(z[i]);    end;

for i:=1 to 600 do rez[i]:=0;

for i:=dl downto 1 do    begin

  for j:=dl downto 1 do  begin

    rez[i+j]:=rez[i+j]+(a[j]*b[i]);

    if rez[i+j]>9 then begin rez[i+j-1]:=rez[i+j-1]+(rez[i+j] div 10);

                             rez[i+j]:=rez[i+j] mod 10;

    end; end; end;

c:='';

for i:=1 to (2*dl) do c:=c+inttostr(rez[i]);

while c[1]='0' do delete(c,1,1);

 label4.Caption:='прозведение этих чисел равно';

edit3.text:=c;

 label10.Caption:='цифр в результате - '+ inttostr(length(c));

end;

   {Здесь идет подсчет частного двух чисел}

procedure TForm1.Button6Click(Sender: TObject);

var m,n,k,des,vs:string; b1:string; u,v,cel:string; i,j:integer;

    an:array[1..600] of integer;

label kon;

begin

label9.Caption:='';

edit3.Text:='';

m:=edit1.Text;

n:=edit2.Text;

if n=bolshee(m,n) then begin m:=vic1(n,m); cel:='0'; goto kon; end;

if m=n then begin cel:='1'; m:='0'; goto kon; end;

for i:=1 to 600 do an[i]:=0;

cel:='';

des:='10';

j:=length(m);

while m=bolshee(m,n) do begin

vs:='1';

b1:=n;

while length(m)<>length(b1) do begin b1:=umnoz(b1,des);

                            vs:=umnoz(vs,des); end;

if b1=bolshee(m,b1) then begin delete(b1,length(b1),1);

                               delete(vs,length(vs),1); end;

k:=b1; i:=1;

while m=bolshee(m,k) do begin

i:=i+1;

k:=umnoz(b1,inttostr(i));

end;

if k=m then begin m:='0'; cel:=cel+inttostr(i)+vs; goto kon; end;

i:=i-1;

an[length(vs)]:=i;

{cel:=cel+inttostr(i);}

if i=0 then begin m:=vic1(m,b1); goto kon; end;

k:=umnoz(b1,inttostr(i));

m:=vic1(m,k);

end;

for i:=1 to length(vs) do if vs[i]='1' then delete(vs,i,1);

cel:='';

for i:=j downto 1 do cel:=cel+inttostr(an[i]);

while cel[1]='0' do delete(cel,1,1);

{cel:=cel+vs;}

kon:

label4.caption:='Целая часть '+cel;

edit3.text:='Остаток от деления '+m;

label10.Caption:='Цифр в целой части - ' +inttostr(length(cel));

label9.caption:='Цифр в остатке - ' +inttostr(length(m));

end;

procedure TForm1.Image1Click(Sender: TObject);

begin

end;

end.

6. Литература

  1. Прищепов М.А., Степанцов В.П., Севернева Е.В. Экзамен по информатике. Основы алгоритмизации и программирования. – Минск: ТетраСистемс, 2001.
  2. Семакин И.Г., Шестаков А.П. Основы программирования: Учебник. М.: Мастерство; НМЦ СПО; Высш. шк., 2001.
  3. Баас Р., Фервай М. и др. Delphi 6 для пользователя. -  К.: Издательская группа  BHV, 2003
  4. Мейер Б., Бодуэн К. Методы программирования. – М.: Мир, 1999
  5. Клименко С.В., Коломиец А.Д.  Математические основы программирования – СПб.: Питер, 2003.

По теме: методические разработки, презентации и конспекты

Обобщающий урок по теме сложения, умножения, деления отрицательных чисел и чисел с разными знаками.

Урок - лабиринт по теме: "Сложение, умножение, деление отрицательных чисел и чисел с разными знаками". Формы подачи задач в виде таблиц, схем, блок - схем, лабиринтов. Содержатся вопросы, направленные...

Приближённые значения чисел. Округление чисел.

Урок изучения нового материала по математике в 5 классе....

ПОЛОЖЕНИЕ о выборах Совета ученического самоуправления, председателя Совета ученического самоуправления Токурской средней общеобразовательной школы

В форме деловой игры проходят выборы  ученического самоуправления, избирательная комиссия состоит из 11-ти классников, подсчет голосов и объявление итогов выборов  в этот же день. Написан по...

КАК СДЕЛАТЬ УЧЕНИЧЕСКИЙ РЕФЕРАТ ИЛИ ТЕХНОЛОГИИ НАПИСАНИЯ УЧЕНИЧЕСКОГО РЕФЕРАТА.

Данная статья содержит рекомандации по работе над рефератом по историии в старших классах....

Мастер-класс "Ученическое самоуправление. Варианты структур органов ученического самоуправления»

Тема: «Ученическое самоуправление. Варианты структур органов  ученического самоуправления».Цель: формирование представления об ученическом самоуправлении, вариантах структур ученическ...