|
(******************************************************************************)
(**) ОТДЕЛ ЧислоЕ+;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: вычисление 'ЗНАКОВ'=1024 числа "e" после запятой *)
(* АЛГОРИТМ: *)
(* E = 1 + X1 + X2 + ... + Xi + ... , где Xi = 1/1/2/3/.../i *)
(* ОБОЗНАЧЕНИЯ: *)
(* р - значение десятичного разряда *)
(* п - позиция разряда *)
(* п0 - число ведущих 0-х разрядов в Xi *)
(******************************************************************************)
ИСПОЛЬЗУЕТ
Вывод ИЗ "...\Отделы\Обмен\";
ПОСТ
ЗНАКОВ=1024;
ЦИФР=ЗНАКОВ + (ЗНАКОВ+31) ДЕЛИТЬ 32; (* цифр для расчёта *)
ВИД
Число=РЯД ЦИФР ИЗ ЯЧЦЕЛ;
(* [0] - единицы
* [1] - десятые
* [2] - сотые
* и т.д. *)
(******************************************************************************)
ЗАДАЧА Разделить(X+:Число; i,п0+:ЦЕЛ); (* X:=X/i *)
ПЕР
п,р:ЦЕЛ;
УКАЗ
р:=0;
ОТ п:=п0 ДО ЦИФР-1 ВЫП
р:=10*р+X[п];
X[п]:=УЗК(УЗК(р ДЕЛИТЬ i));
р:=р ОСТАТОК i
КОН;
(* продвигаем п0 *)
ПОКА (п0 < ЦИФР) И (X[п0] = 0) ВЫП
УВЕЛИЧИТЬ(п0)
КОН
КОН Разделить;
(******************************************************************************)
ЗАДАЧА Добавить(E+,X-:Число; п0:ЦЕЛ); (* E:=E+X *)
ПЕР
п:ЦЕЛ;
р:ЯЧЦЕЛ;
УКАЗ
р:=0;
ОТ п:=ЦИФР-1 ДО п0 ПО -1 ВЫП
УВЕЛИЧИТЬ(р,E[п]+X[п]);
ЕСЛИ р >= 10 ТО
E[п]:=р-10;
р:=1
ИНАЧЕ
E[п]:=р;
р:=0
КОН
КОН;
ПОКА р # 0 ВЫП
УВЕЛИЧИТЬ(р,E[п]);
ЕСЛИ р >= 10 ТО
E[п]:=р-10;
р:=1
ИНАЧЕ
E[п]:=р;
р:=0
КОН;
УМЕНЬШИТЬ(п)
КОН
КОН Добавить;
(******************************************************************************)
ЗАДАЧА ВыводЧисла(E-:Число); (* Вывод на экран числа E *)
ПЕР
п:ЦЕЛ;
УКАЗ
Вывод.ЧЦел("^ e = %d.%d",E[0],E[1],0,0);
ОТ п:=2 ДО ЗНАКОВ ВЫП
ЕСЛИ п ОСТАТОК 64 = 1 ТО
Вывод.ЧЦел("^%5d: ",п,0,0,0);
КОН;
Вывод.ЧЦел("%d",E[п],0,0,0)
КОН
КОН ВыводЧисла;
(******************************************************************************)
ЗАДАЧА Расчёт;
(* Распределение памяти, расчёт по алгоритму и вывод ответа на экран *)
ПЕР
E,X:ДОСТУП К Число;
п0,i:ЦЕЛ;
УКАЗ
Вывод.Цепь("^Расчёт числа 'e': 1 + 1/1 + 1/1/2 + 1/1/2/3 + ... .");
СОЗДАТЬ(E);
СОЗДАТЬ(X);
X[0]:=1; (* X:=1.0 *)
E[0]:=1; (* E:=1.0 *)
п0:=0;
i:=1;
ПОВТОРЯТЬ
Разделить(X^,i,п0);
Добавить(E^,X^,п0);
УВЕЛИЧИТЬ(i)
ДО п0 = ЦИФР;
Вывод.ЧЦел("^Всего: %d слагаемых, %d знака после запятой, %d цифр для расчёта.^",
i, ЗНАКОВ, ЦИФР, 0);
ВыводЧисла(E^)
КОН Расчёт;
УКАЗ
Расчёт
КОН ЧислоЕ.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|