高精度计算
高精度计算是一种程序设计的算法。由于中央處理器的字長限制,如32位CPU中一个整数最大只能取值4,294,967,295(=232-1)。因此在进行更大范围的数值计算中,往往要采取模拟手段。通常通过分离字符的方法通过数字数组进行输入、通过数组倒序输出、通过模拟竖式计算进行计算。一般而言,主要模拟的是按位运算,可以用不同的進位制達成不同的目的。 有許多程式庫支援高精度計算,最著名的是GNU多重精度運算庫。另外,Java,Python和Pascal也有原生的高精度运算支持。 应用高精度计算的一个常见应用是公开密钥加密,这些算法经常对长度上百位的整数进行运算。[1][2]高精度计算的另一个应用是在需要没有人为限制位数和没有算术溢出的情况下使用。在检查固定精度计算的结果以及确定公式中系数的精确值或近似值时,高精度计算也很有用。比如,在高斯求积中,我们需要确定的值。[3] 实现高精度加法简介高精度加法是信息学的一种重要算法。这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。 基本算法以358934760892734899+38960302975237462为例: 1、计算结果的位数 358934760892734899共18位 38960302975237462 共17位 故结果不会超过19位。 2、将要计算的数字分割成多段,按照顺序排列(这里以0-32767作为每一存储单位存储的数的限制):
(为提高空间利用效率,可以一个存储单位存储多位数。) 3、将两数相加。
4、输出结果。 从高位到低位依次输出。除最高位以外,其他低位上不足4位的要在前面补上0。 代码实现pascal: var
a,b,c:array[1..201] of integer;
n:string;
lena,lenb,lenc,i,x:integer;
begin
readln(n);
lena:=length(n);
for i:=1 to lena do a[lena-i+1]:=ord(n[i])-ord('0');
readln(n);
lenb:=length(n);
for i:=1 to lenb do b[lenb-i+1]:=ord(n[i])-ord('0');
i:=1; x:=0;
while (i<=lena) or(i<=lenb) do
begin
c[i]:=a[i]+b[i]+x;
x := c[i] div 10;
c[i] := c[i] mod 10;
i := i + 1;
end;
if x>0 then
begin
lenc:=i;
c[i]:=x;
end
else lenc:=i-1;
for i:=lenc downto 1 do write(c[i]);
end.
c++: #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
short a[510],b[510];
char ca[510],cb[510];
short ans[510];
short len;
void add(short a[],short b[])
{
for(int i=0;i<len;++i)
{
ans[i]+=a[i]+b[i];
if(ans[i]>=10)
{
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
}
if(ans[len])
len++;
else
while((!ans[len-1])&&len>1)len--;
return;
}
int main()
{
scanf("%s",ca);
scanf("%s",cb);
short lena=strlen(ca);
short lenb=strlen(cb);
len=max(lena,lenb);
for(short i=0;i<lena;++i)
a[lena-i-1]=ca[i]&15;
for(short i=0;i<lenb;++i)
b[lenb-i-1]=cb[i]&15;
add(a,b);
for(short i=len-1;i>=0;--i)
putchar(ans[i]|'0');
return 0;
}
参见参考文献
|
Index:
pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve
Portal di Ensiklopedia Dunia