Длинная арифметика, числа > longint |
Длинная арифметика, числа > longint |
virt |
5.07.2004 16:23
Сообщение
#1
|
Знаток Группа: Пользователи Сообщений: 419 Пол: Мужской Репутация: 6 |
иногда нужно вычислять очень длинные числа ,например 14! = 87.178.291.200
в стандартные типы данных не лезет. Поэтому есть длинная арифметика. Код const _maxdig=1000;{максимальное количество 4х значных цифр} _osn=10000;{основание системы счисления} type Tlong=array[0.._maxdig]of integer;{здесь храним само число} Plong=^Tlong; например число 1234567890 запишется так : | 0 | 1 | 2 | 3 | 4 | ... -- индексы элементов массива ---------------------------------------------- | 3 | 7890 | 3456 | 12 | 0 | ... -- значения элементов ---------------------------------------------- нулевой элемент массива -- количество 4х значных цифр. чтение и запись длинных чисел : procedure ReadLong(var f:text;a:Plong); сложение и вычитание двух длинных чисел : procedure SumLongTwo(a,b,c:Plong); сравнение длинных чисел : function EqLong(a,b:Plong):boolean;{a=b} умножение длинного числа на короткое : procedure MulLongShort(a:Plong;const k:longint;c:Plong); умножение двух длинных чисел : procedure MulLongTwo(a,b,c:Plong); деление двух длинных чисел : function FindBin(ost,b:Plong;const sp:integer):longint; Прикрепленные файлы dlinna.zip ( 5.27 килобайт ) Кол-во скачиваний: 2680 |
volvo |
21.12.2004 20:38
Сообщение
#2
|
Гость |
Модуль для работы с длинной арифметикой:
В присоединенном модуле длинные числа реализованы как объекты. С длинными числами допустимы следующие операции: 1. Constructor Init(x: LongInt); Инициализирует длинное число значением X (инициализация должна быть произведена перед первым обращением к остальным методам...) 2. Function Cmp(Const B: TLargeInt): Integer; Функция сравнения данного экземпляра с другим длинным числом В... Возвращает следующие результаты: Цитата -1, если Self < B 0, если Self = B +1, если Self > B 3. Function CmpDigit(x: Digit): Integer; Функция сравнения данного экземпляра с "коротким" числом x... Возвращает следующие результаты: Цитата -1, если Self < x 0, если Self = x +1, если Self > x 4. Procedure AddDigit(x: Digit); Сложение данного экземпляра с "коротким" числом x. При переполнении выдает соответствующую ошибку и прерывает исполнение программы. 5. Procedure SubDigit(x: Digit); Вычитание "короткого" числа x из данного экземпляра. При переходе к отрицательному значению выдает соответствующую ошибку и прерывает исполнение программы. 6. Procedure MulDigit(x: Digit); Умножение данного экземпляра на "короткое" число x. При переполнении выдает соответствующую ошибку и прерывает исполнение программы. 7. Function DivDigit(x: Digit): Digit; Целочисленное деление данного экземпляра на "короткое" число x. При переполнении выдает соответствующую ошибку и прерывает исполнение программы. Функция возвращает остаток (mod) от деления чисел... 8. Procedure Add(Const B: TLargeInt); Аналогична AddDigit, но предназначена для сложения двух длинных чисел 9. Procedure Sub(Const B: TLargeInt); Аналогична SubDigit, но предназначена для вычитания двух длинных чисел 10. Procedure Mul(Const B: TLargeInt); Аналогична MulDigit, но предназначена для перемножения двух длинных чисел 11. Procedure Print(Var f: Text); Выводит значение данного экземпляра в текстовый файл, определяемый переменной f (для вывода на экран используется output) Кроме этого, модуль содержит реализацию вычисления факториала, корректно работающую с числами больше 12... Procedure Fact(Var A: TLargeInt; n: LongInt); Пример использования данного модуля: Код uses hugeobj; { Вывести на экран значения факториалов чисел 1 - 100 } var f: TLargeInt; i: longint; begin for i := 1 to 100 do begin fact(f, i); f.print(output); writeln; writeln; end; end. Прикрепленные файлы HUGEOBJ.PAS ( 7.05 килобайт ) Кол-во скачиваний: 2003 |
Текстовая версия | 24.09.2024 5:30 |