请输入您要查询的百科知识:

 

词条 高精度算法
释义

高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。

简介

对高精度数,也要像常用的数那样做加减乘除以及乘方的运算,但又因其特殊所以就有了高精度算法:

代码

Pascal代码

下面提供了Pascal的高精度加法, 高精度乘以单精度, 高精度乘以高精度的代码, 其他版本请各位大牛添加进来吧!

Pascal代码

Pascal代码如下(非完整); k为预定进制,加大进制以提高速度。

Procedure HPule(a, b: Arr; Var c:Arr); //高精度加法

Var

i: Integer;

Begin

FillChar(c, SizeOf(c), 0);

For i:= 1 To Maxn-1 Do Begin

c[i]:= c[i] + a[i] + b[i];

c[i + 1] := c[i] Div k;

c[i] := c[i] Mod k;

End;

End;

Procedure HPule(a: Arr; b:Integer; Var c:Arr); //高精度乘以单精度

Var

i: Integer;

Begin

FillChar(c, SizeOf(c), 0);

For i:= 1 To Maxn-1 Do Begin

c[i] := c[i] + a[i] * b;

c[i+1]:= c[i] Div k;

c[i]:= c[i] Mod k

End;

End;

Procedure HPule(a, b: Arr; ; Var c:Arr); //高精度乘以高精度

Var

i, j: Integer;

Begin

FillChar(c, SizeOf(c), 0);

For i:= 1 To Maxn Do

For j := 1 To Maxn Begin

c[i+j-1] := c[i+j-1] + a[i] * b[j];

c[i+j]:=c[i+j]+( c[i+j-1] Div k);

c[i+j-1]:= c[i+j-1] Mod k

End;

End;

Ps:为了防止百度错误识别, 过程中有不少符号是全角状态输入.

高精度加法

var

a,b,c:array[1..201] of 0..9;

n:string;

lena,lenb,lenc,i,x:integer;

begin

write('Input augend:'); readln(n);lena:=length(n);

for i:=1 to lena do a[lena-i+1]:=ord(n)-ord('0');{加数放入a数组}

write('Input addend:'); readln(n); lenb:=length(n);

for i:=1 to lenb do b[lenb-i+1]:=ord(n)-ord('0');{被加数放入b数组}

i:=1;

while (i<=lena) or(i<=lenb) do

begin

x := a + b + x div 10; {两数相加,然后加前次进位}

c := x mod 10; {保存第i位的值}

i := i + 1

end;

if x>=10 {处理最高进位}

then begin lenc:=i; c:=1 end

else lenc:=i-1;

for i:=lenc downto 1 do write(c); writeln {输出结果}

end.

高精度乘法(低对高)

const max=100; n=20;

var a:array[1..max]of 0..9;

i,j,k;x:integer;

begin

k:=1; a[k]:=1;{a=1}

for i:=2 to n do{a*2*3….*n}

begin

x:=0;{进位初始化}

for j:=1 do k do{a=a*i}

begin

x:=x+a[j]*i; a[j]:=x mod 10;x:=x div 10

end;

while x>0 do {处理最高位的进位}

begin

k:=k+1;a[k]:=x mod 10;x:=x div 10

end

end;

writeln;

for i:=k dowento 1 write(a){输出a}

end.

高精度乘法(高对高)

var a,b,c:array[1..200] of 0..9;

n1,n2:string; lena,lenb,lenc,i,j,x:integer;

begin

write('Input multiplier:'); readln(n1);

write('Input multiplicand:'); readln(n2);

lena:=length(n1); lenb:=length(n2);

for i:=1 to lena do a[lena-i+1]:=ord(n1)-ord('0');

for i:=1 to lenb do b[lenb-i+1]:=ord(n2)-ord('0');

for i:=1 to lena do

begin

x:=0;

for j:=1 to lenb do{对乘数的每一位进行处理}

begin

x := a*b[j]+x div 10+c;{当前乘积+上次乘积进位+原数}

c:=x mod 10;

end;

c:= x div 10;{进位}

end;

lenc:=i+j;

while (c[lenc]=0) and (lenc>1) do dec(lenc); {最高位的0不输出}

for i:=lenc downto 1 do write(c); writeln

end.

高精度除法

算法一 procedure high_devide(a,b:hp; var c,d:hp);

var

i,len:integer;

begin

fillchar(c,sizeof(c),0);

fillchar(d,sizeof(d),0);

len:=a[0];d[0]:=1;

for i:=len downto 1 do begin

multiply(d,10,d);

d[1]:=a[i];

while(compare(d,b)>=0) do {即d>=b}

begin

Subtract(d,b,d);

inc(c[i]);

end;

end;

while(len>1)and(c.s[len]=0) do dec(len);

c.len:=len;

end;

算法二

fillchar(s,sizeof(s),0);{小数部分初始化}

fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}

len←0;st←0; {小数部分的指针和循环节的首指针初始化}

read(x,y);{读被除数和除数}

write(x div y);{输出整数部分}

x←x mod y;{计算x除以y的余数}

if x=0 then exit;{若x除尽y,则成功退出}

while lenlimit do{若小数位未达到上限,则循环}

begin

inc(len);posix←len;{记下当前位小数,计算下一位小数和余数}

x←x*10; slen←x div y;x←x mod y;

if posix0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}

then begin st←posix; break;end;{then}

if x=0 then break; {若除尽,则成功退出}

end;{while}

if len=0

then begin writeln;exit;end;{若小数部分的位数为0,则成功退出;否则输出小数点}

write(.);

if st=0 {若无循环节,则输出小数部分,否则输出循环节前的小数和循环节}

then for i←1 to len do write(s)

else begin

for i←1 to st-1 do write(s);

write();

for i←st to len do write(s);

write();

end;{else}

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/7 19:44:03