Существуют числа, которые невозможно описать просто переменной числового типа начиная с byte и заканчивая extended и, следовательно, встроенные арифметические функции для них применить нельзя.
Данная программа содержит в себе набор функций, дающих возможность обрабатывать числа, которые можно было бы назвать сверхбольшими, или сверхмалыми, т.е. те, количество знаков которых может превышать несколько сотен.
Все функции реализованы только для положительных и целых чисел, но переписать все для дробных просто, если принять во внимание тот факт, что дробное число – это два целых, разделенных точкой. Такая расширенная реализация будет нашим следующим шагом.
Вложение | Размер |
---|---|
sverhbolshie_i_sverhmalye_chisla-proekt1.doc | 141.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 знаков. Но ведь существуют гораздо большие числа! Например, при работе криптоалгоритмов используются числа со значениями в сотни и даже тысячи знаков. Интересная область применения больших чисел - это работа с числами повышенной точности. Представление чисел с плавающей точкой неточно, ошибки накапливаются. Так возникла идея создания нашего проекта.
Цель: найти способ, дающий возможность хранить в памяти и обрабатывать числа, которые можно было бы назвать сверхбольшими, или сверхмалыми, т.е. те, количество знаков которых может превышать несколько сотен.
Для достижения поставленной цели необходимо решить следующие задачи:
В ходе работы пришлось столкнуться с недостатком описания в литературе алгоритмов работы с многоразрядными числами, сводящихся в основном к реализации операций сложения, вычитания и умножения большого числа на маленькое, поэтому большая часть нашей работы строится на нашем понимании данного вопроса.
Предложенный алгоритм является плодом собственных представлений о том, как можно обработать на компьютере число с большим количеством разрядов.
Работа состояла из нескольких этапов:
Представленная программа реализована на языке Delphi и демонстрирует возможность нахождения НОД для сверхбольших и сверхмалых чисел, а также некоторые арифметические операции для этих чисел.
Данный алгоритм может быть использован при изучении программирования на языках высокого уровня, а также при проведении точных расчетов с числами, количество знаков в которых более 50, т.е. при построении криптоалгоритмов, в астрономии и т.п.
3. Описание работы.
3.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. Литература
Кто грамотней?
5 зимних аудиосказок
Как нарисовать черёмуху
Рисуем крокусы акварелью
Весёлая кукушка