HugeUtil(大数)支持单元

简介: unit HugeUtil; interface const HugeMax = $8000-16; type Huge = record len : word; dat : array[1.

unit HugeUtil;

interface

const HugeMax = $8000-16;

type Huge = record
len : word;
dat : array[1..HugeMax] of word;
end;
HugePtr = ^Huge;

procedure AddHuge (var Answer, Add : Huge);
procedure MulHuge (var A : Huge; Mul : integer; var Answer : Huge);
procedure DivHuge (var A : Huge; Del : integer; var Answer : Huge;
var Remainder : integer);
procedure SubHuge (var Answer, Sub : Huge);
procedure ZeroHuge (var L : Huge; Size : word);
procedure CopyHuge (var Fra,Til : Huge);
procedure GetHuge (var P : HugePtr; Size : word);
procedure WriteHuge(var L : Huge; Size: word);

implementation

procedure AddHuge; assembler; asm
cld
push ds
lds di,Answer
les si,Add
seges lodsw
mov cx,ax
clc
@l1:
seges lodsw
adc [si-2],ax
loop @l1
jnb @done
@l2:
add word [si],1
inc si
inc si
jc @l2
@done:
mov si,di
lodsw
shl ax,1
add si,ax
lodsw
or ax,ax
je @d2
inc word [di]
@d2:
pop ds
end;

procedure MulHuge; assembler; asm
cld
push ds
lds si,A
mov bx,Mul
les di,Answer
mov cx,[si]
mov dx,si
inc di
inc di
clc
@l1:
mov ax,[di]
pushf
mul bx
popf
adc ax,si
stosw
mov si,dx
loop @l1
adc si,0
mov es:[di],si
lds di,A
mov di,[di]
mov ax,[di+2]
or ax,ax
je @l2
inc di
inc di
@l2:
lds si,Answer
mov [si],di
pop ds
end;

procedure DivHuge; assembler; asm
std
push ds
lds si,A
mov bx,Del
les di,Answer
mov cx,[si]
mov di,cx
add di,cx
xor dx,dx
@l1:
mov ax,[di]
div bx
stosw
loop @l1
lds si,Remainder
mov [si],dx
lds si,A
mov ax,[si]
lds di,Answer
mov [di],ax
mov si,[di]
shl si,1
@d3:
lodsw
or ax,ax
jne @d2
dec word [di]
jne @d3
inc word [di]
@d2:
pop ds
end;

procedure SubHuge; assembler; asm
cld
push ds
lds di,Answer
les si,Sub
seges lodsw
mov cx,ax
clc
@l1:
seges lodsw
sbb [si-2],ax
loop @l1
jnb @done
@l2:
sub word [si],1
inc si
inc si
jc @l2
@done:
mov si,[di]
shl si,1
std
@d3:
lodsw
or ax,ax
jne @d2
dec word [di]
jne @d3
inc word [di]
@d2:
pop ds
end;

procedure WriteHuge;
var L1, L2, I, R, R1, X : integer;
begin
with L do begin
L1 := Len;
L2 := L1 - 1;
I := 1;
write(dat[L1],'.');
X := 0;
for I := 1 to Size div 4 do begin
Dat[L1] := 0;
Len := L2;
MulHuge(L,10000,L);
R := dat[L1];
R1 := R div 100;
R := R mod 100;
write(chr(R1 div 10+48), chr(R1 mod 10+48),
chr(R div 10+48), chr(R mod 10+48));
inc(X);
write(' ');
if X > 14 then begin
writeln; write(' ');
X := 0
end
end
end;
writeln
end; { WriteHuge }

procedure ZeroHuge;
begin
fillchar(L.Dat, Size * 2, #0);
L.Len := Size
end;

procedure CopyHuge;
begin
move(Fra, Til, Fra.Len * 2 + 2)
end;

procedure GetHuge;
var D : ^byte;
Tries,
Bytes : word;
begin
Bytes := 2 * (Size + 1);
Tries:=0;
repeat
getmem(P,Bytes);

{ To make it possible to use maximally large arrays, and to increase
the speed of the computations, all records of type Huge MUST start
at a segment boundary! }

if ofs(P^) = 0 then begin
ZeroHuge(P^,Size);
exit
end;
inc(Tries);
freemem(P,Bytes);
new(D)
until Tries>10; { if not done yet, it's not likely we ever will be }
writeln('Couldn''t get memory for array');
halt(1)
end; { GetHuge }

end.

相关文章
|
7月前
【代数学作业5】理想的分解:高斯整数环中理想的结构,并根据其范数和素数的性质进行分解
【代数学作业5】理想的分解:高斯整数环中理想的结构,并根据其范数和素数的性质进行分解
95 0
|
7月前
|
移动开发
【机组】算术逻辑运算单元实验的解密与实战
【机组】算术逻辑运算单元实验的解密与实战
117 0
|
7月前
|
SQL 关系型数据库 MySQL
无法针对行和行之间的运算
无法针对行和行之间的运算
45 0
|
4月前
|
算法
【算法】位运算算法——两整数之和
【算法】位运算算法——两整数之和
|
6月前
技术心得:实数域的戴德金分划和有理数域的戴德金分划,以及戴德金原理
技术心得:实数域的戴德金分划和有理数域的戴德金分划,以及戴德金原理
34 0
|
7月前
|
存储
不同数据类型之间混合运算
该内容是一个编程问题示例,要求将大写字母转换为小写字母。解题关键点在于,小写字母的ASCII码比对应大写字母大32。提供了两张图片来展示ASCII码的差异和转换结果。
55 0
|
7月前
|
语音技术 Python
量化模型是将浮点数运算转换为整数运算的过程
【2月更文挑战第32天】量化模型是将浮点数运算转换为整数运算的过程
70 1
|
7月前
【代数学习题3】从零理解数域扩张与嵌入 —— 同构、商环、分裂域与同态映射
【代数学习题3】从零理解数域扩张与嵌入 —— 同构、商环、分裂域与同态映射
411 0
|
异构计算
【ALU】32-bit低时延高速整数ALU的设计|超前进位加法器
【ALU】32-bit低时延高速整数ALU的设计|超前进位加法器
【ALU】32-bit低时延高速整数ALU的设计|超前进位加法器
|
Rust 自然语言处理 算法
【算法】1913. 两个数对之间的最大乘积差(多语言实现)
两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。 例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16 。 给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。 返回以这种方式取得的乘积差中的 最大值 。