-
高精度加法
鎖定
- 中文名
- 高精度加法
- 別 名
- 高精加
- 分 類
- 計算機術語
- 作 用
- 進行超過使用一個存儲範圍的加法
- 方 法
- 使用多個存儲單位運算加法
高精度加法基本算法
以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; }