高精度加法

高精度加法

高精度加法是信息學的一種重要算法。這種算法使用多個存儲單位進行計算,因此它的計算範圍超過一般使用一個存儲單位的算法。也是一些信息學競賽的常考題目。

基本算法,pascal程式,C語言程式,

基本算法

以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程式

vara,b,c:array[1..201]of 0..9;n:string;lena,lenb,lenc,i,x:integer;beginwrite('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)dobeginx:=a[i]+b[i]+x div 10;{兩數相加,然後加前次進位}c[i]:=x mod 10;{保存第i位的值}i:=i+1;end;if x>=10{處理最高進位}thenbeginlenc:=i;c[i]:=1;endelselenc:=i-1;for i:=lenc downto 1 do write(c[i]);{輸出結果}end.
方法二
vara: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 doa[l1+1-i]:=ord(s1[i])-ord('0');for i:=1 to l2 dob[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;beginlen:=length(x);for i:=1 to len dod[len-i+1]:=ord(x[i])-ord('0');end;beginreadln(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 dobegina[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 thenk:=k+1;for j:=k downto 1 dowrite(a[j]);end.

C語言程式

#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;char sa[1000],sb[10000];int a[1000],b[1000],c[1000];int la,lb,lc;int main(){    scanf("%s %s",sa,sb);    la=strlen(sa);    lb=strlen(sb);    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    for (int i=0;i<la;i++)    a[la-i-1]=sa[i]-'0';    for (int i=0;i<lb;i++)    b[lb-i-1]=sb[i]-'0';    lc=la>lb?la:lb;    // if (la>lb) lc=la;else lc=lb;    memset(c,0,sizeof(c));    for (int i=0;i<lc;i++)    {        c[i]=a[i]+b[i]+c[i];        if (c[i]>=10) {c[i+1]=1;c[i]-=10;}    }    if (c[lc]>0) lc++;    for (int i=lc-1;i>=0;i--)    printf("%d",c[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;}

相關詞條

熱門詞條

聯絡我們