高精度模板

pascal模板

字符串转数组

procedure change(var s:ansistring; var a:arraytype; var a1:longint);

var

  t:longint;

begin

  t:=length(s);

  for i:=t downto 1 do

  val(s[i],a[t-i+1]);

  a1:=t;

end;

      这段一般来说用处不大,但是初学时的一些程序常用的。

高精加法

procedure c1(var a,b,c:arraytype; var a1,b1,c1:longint);

var

  i,j,k,x:longint;

begin

  i:=1; x:=0;

  while (i<=a1)or(i<=b1) do

  begin

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

    x:=c[i] div modnum;

    c[i]:=c[i] mod modnum;

    inc(i);

  end;

  if x>0 then begin

    c1:=i;

    c[i]:=x;

  end

  else c1:=i-1;

end;

      数组的加法应用范围还是比较广的,比如数列的迭代,就像斐波那契数列一样,还有在应用过程中,如果是迭代的话,两个数组就够了,c1(x1,x2,x1,l1,l2,l1) 即可简单完成迭代。

高精减法

procedure c2(var a,b:arraytype; var a1,b1:longint);

var

  i,j,k,x:longint;

begin

  i:=1; x:=0;

  while i<=b1 do

  begin

    if a[i]<b[i] then

    begin

      a[i]:=a[i]+modnum-b[i];

      dec(a[i+1]);

    end

    else a[i]:=a[i]-b[i];

    inc(i);

  end;

  while a[i]=0 do dec(i);

  a1:=i;

end;

高精减法倒是不常用,不过,熟练了之后也可以轻松打出来的。

高精乘法 

procedure c3(var a,b,c:arraytype; var a1,b1,c1:longint);

var

  i,j,k,x:longint;

begin

  for i:=1 to a1 do

  begin

    x:=0;

    for j:=1 to b1 do

    begin

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

      x:=c[i+j-1] div modnum;

      c[i+j-1]:=c[i+j-1] mod modnum;

    end;

    c[i+j]:=c[i+j]+x;

  end;

  c1:=a1+b1;

  while (c1>1)and(c[c1]=0) do

  dec(c1);

end;

       乘法最后要略略注意的是while (c1>1)and(c[c1]=0) do dec(c1);

      一开始我总喜欢打成if语句,往往都会导致错误,切记切记

 高精除单精

procedure c4(var a:arraytype; var a1,k:longint);

var

  i,j,x:longint;

begin

  x:=0;

  for i:=a1 downto 1 do

  begin

    a[i]:=a[i]+x*modnum;

    x:=a[i] mod k;

    a[i]:=a[i] div k;

  end;

  while (a1>1)and(a[a1]=0) do dec(a1);

end;

高精乘单精 

procedure cc(var a:arraytype; var a1:longint; k:longint);

var

  i,j,x:longint;

begin

  x:=0;

  for i:=1 to a1 do

  begin

    a[i]:=a[i]*k+x;

    x:=a[i] div modnum;

    a[i]:=a[i] mod modnum;

  end;

  while x>0 do

  begin

    inc(a1);

    a[a1]:=x mod modnum;

    x:=x div modnum;

  end;

end;

      两个高精度数的运算还是不多的,主要还是高精和单精的组合灵活性比较大,比如在组合数学中的应用,或是算阶乘之类的还是很常见的。

高精度的压位

       压位是高精度中的常用技巧,在数据规模相对比较大的情况下,压位的高精度往往有更强的应用能力,比较快的是longint压位4位,int64压位八位,如果没有复数,用dword和qword算的更快一些,

      其实压位非常简单,只要将modnum设为10000 就是了,最后输出时字符串处理一下即可:

write(x1[l1]);

  for i:=l1-1 downto 1 do

  begin

    str(x1[i],s);

    while length(s)<4 do s:='0'+s;

    write(s);

  end;

       总之呢,高精度还是简单的,这只是一种工具,但是,细节该注意的还是必须得注意……

你可能感兴趣的:(模板)