高精度模板
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;
总之呢,高精度还是简单的,这只是一种工具,但是,细节该注意的还是必须得注意……
愿你出走半生,归来仍是少年