高精度模板

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;

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

愿你出走半生,归来仍是少年

原文地址:https://www.cnblogs.com/forever97/p/3426569.html