Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru

Познавательное программирование

(comp.soft.prog.urisprog)

Выпуск 25


Здравствуйте, Уважаемые подписчики!

С новым годом Вас, начинающие и профессиональные Программисты!
- Автор рассылки.


Предисловие

Итак, 25-ый, полуюбилейный выпуск.
В этом предновогоднем выпуске я приготовил кое-что действительно экзотическое.
Я публикую свою разработку специально для рассылки. Может никакого практического применения эта программа не имеет, зато как нельзя кстати подходит под определение "ПОЗНАВАТЕЛЬНАЯ".

Так вот. Программа, сделанная на обычном Turbo Pascal, состоит из двух частей - модуль и программа, которая демонстрирует его возможности.
Суть программы - операции с огромными многознаковыми натуральными числами. Программа умеет только складывать такие числа и умножать их на LONGINT-число. Для хранения LONG-чисел используются обычные строки string.
Если кто-то сможет сделать её более полноценной (с вычитанием, делением и операциями не только с натуральными но и с обычными целыми числами), буду рад опубликовать её здесь (особенно интересно посмотреть на неё в синтаксисе C++, не то чтобы я не мог её сразу на нём написать - дело в том, много-ли подписчиков взялись бы её читать в этом случае?!).

P.S.: Я пока не сделал программку для подсветки синтаксиса в Pascal'е (для Си++ я такую программку уже давно сотворил), поэтому для удобства перед исследованием рекомендую открыть эти исходные коды через сам паскаль.

ULONGS.PAS - модуль

{ URIS LONG NUMBERS - GENERAL UNIT }
{ (c) 2004 Nabatnikoff Ivan | urisff@inbox.ru }
{ http://subscribe.ru/catalog/comp.soft.prog.urisprog }

UNIT ULONGS;

INTERFACE

procedure lclr(var l: string); {Обнулить LONG-число}
procedure lset(var l: string; const s: string); {Присвоить значение LONG-числу}
function lget(var l: string): string; {Возвратить LONG-число}
function ladd(l1,l2: string): string; {Сложить два LONG-числа}
function lmul(l1: string; x: longint): string; {Умножить LONG-число на LONGINT-число}

IMPLEMENTATION

procedure lclr(var l: string);
begin
FillChar(l,255,0);
l[0]:=#255;
end;

procedure lset(var l: string; const s: string);
var
i,len: integer;
begin
lclr(l);
len:=length(s);
for i:=1 to len do l[len-i+1]:=chr(ord(s[i])-ord('0'));
end;

function lget(var l: string): string;
var
i,b: integer;
r: string;
begin
lclr(r);
for i:=1 to 255 do r[255-i+1]:=chr(ord(l[i])+ord('0'));
b:=255;
for i:=1 to 255 do
If r[i]<>'0' then
begin
b:=i;
break;
end;
r:=copy(r,b,255-b+1);
lget:=r;
end;

function ladd(l1,l2: string): string;
var
i: integer;
r: string;
a: array[1..255] of word;
begin
for i:=1 to 255 do a[i]:=ord(l1[i]);
for i:=1 to 255 do a[i]:=a[i]+ord(l2[i]);
for i:=1 to 255 do
If a[i]>9 then
begin
a[i+1]:=a[i+1]+(a[i] div 10);
a[i]:=a[i] mod 10;
end;
lclr(r);
for i:=1 to 255 do r[i]:=chr(a[i]);
ladd:=r;
end;

function lmul(l1: string; x: longint): string;
var
i: integer;
r: string;
a: array[1..255] of longint;
begin
for i:=1 to 255 do a[i]:=ord(l1[i]);
for i:=1 to 255 do a[i]:=a[i]*x;
for i:=1 to 255 do
If a[i]>9 then
begin
a[i+1]:=a[i+1]+(a[i] div 10);
a[i]:=a[i] mod 10;
end;
lclr(r);
for i:=1 to 255 do r[i]:=chr(a[i]);
lmul:=r;
end;

end.



DEMO.PAS - демонстрация

{ URIS LONG NUMBERS - DEMO PROGRAM }
{ (c) 2004 Nabatnikoff Ivan | urisff@inbox.ru }
{ http://subscribe.ru/catalog/comp.soft.prog.urisprog }

USES ULONGS;
VAR
a,b,c,d: string;
BEGIN
Writeln(#13#10#13#10#13#10,'-**-':40,#13#10#13#10#13#10);

lset(a,'88888888888888888888888888888888888888888888888888');
lset(b,'12345678901234567890123456789012345678901234567890');
Writeln('a=',lget(a):70);
Writeln('b=',lget(b):70);

Writeln(#13#10'c=a+b');
c:=ladd(a,b);
Writeln('c=',lget(c):70);

Writeln(#13#10'd=c*123456');
d:=lmul(c,123456);
Writeln('d=',lget(d):70);
END.



ДИСКИ ПОЧТОЙ
Лучшие фильмы MPEG4, эксклюзивная музыка MP3(metal, rock, рус.рок), редкие клипы и концерты наложенным платежом по всей РФ.
http://cd.h12.ru




Все вопросы, пожелания и предложения ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне (желательно в виде html, причём без картинок). В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.

Ведущий рассылки:
Набатников Иван
urisff@inbox.ru
http://newff.narod.ru


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.urisprog
Отписаться

В избранное