複製鏈接
請複製以下鏈接發送給好友

高精度加法

鎖定
高精度加法是信息學的一種重要算法。這種算法使用多個存儲單位進行計算,因此它的計算範圍超過一般使用一個存儲單位的算法。也是一些信息學競賽的常考題目。
中文名
高精度加法
別    名
高精加
分    類
計算機術語
作    用
進行超過使用一個存儲範圍的加法
方    法
使用多個存儲單位運算加法

高精度加法基本算法

以358934760892734899+38960302975237462為例:
1、計算結果的位數
358934760892734899共18位
38960302975237462共17位
故結果不會超過19位。
2、將要計算的數字分割成多段,按照順序排列(這裏以0-32767作為每一存儲單位存儲的數的限制):
35
8934
7608
9273
4899
3
8960
3029
7523
7462
(為提高空間利用效率,可以一個存儲單位存儲多位數。)
3、將兩數相加。

35
8934
7608
9273
4899

3
8960
3029
7523
7462
和(不進位)
38
17894
10637
16796
12361
和(進位後)
39
7895
0638
6797
2361
4、輸出結果。
從高位到低位依次輸出。除最高位以外,其他低位上不足4位的要在前面補上0。

高精度加法程序

pascal程序
var
a,b,c:array[1..201]of 0..9;
n:string;
lena,lenb,lenc,i,x:integer;
begin
write('Inputaugend:');
readln(n);
lena:=length(n);
for i:=1 to lena do a[lena-i+1]:=ord(n[i])-ord('0');{加數放入a數組}
write('Inputaddend:');
readln(n);
lenb:=length(n);
for i:=1 to lenb do b[lenb-i+1]:=ord(n[i])-ord('0');{被加數放入b數組}
i:=1;
while(i<=lena)or(i<=lenb)do
begin
x:=a[i]+b[i]+x div 10;{兩數相加,然後加前次進位}
c[i]:=x mod 10;{保存第i位的值}
i:=i+1;
end;
if x>=10{處理最高進位}
then
begin
lenc:=i;
c[i]:=1;
end
else
lenc:=i-1;
for i:=lenc downto 1 do write(c[i]);{輸出結果}
end.
方法二
var
a:array[1..10000]of integer;
b,c:array[1..1000]of integer; 
s2,s1:string; 
l2,i,l1,l:integer; 
begin 
readln(s1); 
readln(s2);
l1:=length(s1); 
l2:=length(s2);
for i:=1 to l1 do
a[l1+1-i]:=ord(s1[i])-ord('0');
for i:=1 to l2 do
b[l2+1-i]:=ord(s2[i])-ord('0');
if l1>l2 then l:=l1 else l:=l2;
for i:=1 to l do begin 
c[i]:=a[i]+b[i]+c[i]; 
if c[i]>=10 then begin 
c[i]:=c[i]mod10; 
c[i+1]:=c[i+1]+1; end; 
end; 
if c[l+1]>0 then l:=l+1;
for i:=l downto 1 do 
write(c[i]); end.
方法三
typemaxn=array[0..50000]of longint;
var l1,k,l2,j:integer;
a,b:maxn;
str1,str2:string;
procedure changestr(x:string;vard:maxn);
var 
i,len:integer;
begin
len:=length(x);
for i:=1 to len do
d[len-i+1]:=ord(x[i])-ord('0');
end;
begin
readln(str1);
readln(str2);
l1:=length(str1);
l2:=length(str2);
changestr(str1,a);
changestr(str2,b);
if l1>=l2 then k:=l1 elsek:=l2;
for j:=1 to k do
begin
a[j]:=a[j]+b[j];
a[j+1]:=a[j+1]+a[j] div 10;
a[j]:=a[j] mod 10;
end;
if a[k+1]<>0 then
k:=k+1;
for j:=k downto 1 do
write(a[j]);
end.

高精度加法語言程序

C++語言程序
#include <iostream>
#include <string>
using namespace std;
int m[500],n[500];
int main(){
    string a,b;
    int l1,l2,maxl,i;
    cin>>a>>b;
    //存儲位數 
    l1=a.size();l2=b.size();maxl=max(l1,l2);
    //把字符串的每一個數字裝進數組 
    for(i=0;i<l1;i++)
      m[l1-i-1]=a[i]-'0';
    for(i=0;i<l2;i++)
      n[l2-i-1]=b[i]-'0';
    //模擬加法的過程 
    for(i=0;i<maxl;i++)
    {
        m[i]=m[i]+n[i];
        m[i+1]+=m[i]/10;
        m[i]%=10;
    }
    //判斷溢出的情況 
    if(m[maxl]==1) 
      maxl++;
    //輸出 
    for(i=maxl-1;i>=0;i--)
      cout<<m[i];
    return 0;
}

#include<stdio.h>
#include<string.h>
int main()
{
 char a[10001],b[10001];
 int a1[10001]={0},b1[10001]={0},s[20002]={0};
 int lena,lenb;
 int i,j,k=0,t;
 scanf("%s%s",a,b);
 lena=strlen(a);
 lenb=strlen(b);
 for(i=0;i<lena;i++)
    a1[i]=a[i]-48;
 for(j=0;j<lenb;j++)
    b1[j]=b[j]-48;
 while(i>=0&&j>=0)
 {
  s[k]=a1[i]+b1[j];
  k++;
  i--;
  j--;
 }
 if(i>=0)
 while(i>=0)
 {
  s[k]=a1[i];
  k++;
  i--;
 }
 elseif(j>=0)
 while(j>=0)
 {
  s[k]=b1[j];
  k++;
  j--;
 }
 for(t=1;t<k;t++)
 if(s[t]>=10){s[t]%=10;s[t+1]++;}
 while(s[k]==0)
    k--;
 for(t=k;t>0;t--)
    printf("%d",s[t]);
 return0;
}