-
高精度算法
鎖定
- 中文名
- 高精度算法
- 外文名
- High Accuracy Algorithm
- 適用領域
- 計算機科學
- 所屬學科
- 數據結構與算法分析
高精度算法Pascal
高精度加法
var a,b,c: array[1..201] of 0..9; n:string; lenalenb,lenc,i,x:integer; begin write('Inputaugend:'); readln(n); lena:=length(n); for i:=1 to lena do a[lena-i+1]:=ord(n)-ord('0');{加數放入a數組} write('Inputaddend:'); readln(n); lenb:=length(n); for i:=1 to lenb do b[lenb-i+1]:=ord(n)-ord('0');{被加數放入b數組} i:=1; while (i<=lena)or(i<=lenb) do begin x:=a[i]+b[i]+xdiv10;{兩數相加,然後加前次進位} c[i]:=xmod10;{保存第i位的值} i:=i+1 end; if x>=10 {處理最高進位} then begin lenc:=i; c:=1; end else enc:=i-1; for i:=lenc downto 1 do write(c); writeln;{輸出結果} end.
高精度乘法低對高
constmax=100;n=20; vara: array[1..max]of0..9; i,j,k,x:integer; begin k:=1;a[k]:=1;{a=1} fori:=2tondo{a*2*3….*n}begin x:=0;{進位初始化} forj:=1tokdo{a=a*i}begin x:=x+a[j]*i; a[j]:=xmod10; x:=xdiv10 end; whilex>0do{處理最高位的進位}begin k:=k+1; a[k]:=xmod10; x:=xdiv10 end; end; writeln; fori:=kdownto1write(a);{輸出a} end.
高精度乘法高對高
vara,b,c: array[1..200]of0..9; n1,n2:string; lena, lenb,lenc,i,j,x:integer; begin write('Inputmultiplier:');readln(n1); write('Inputmultiplicand:');readln(n2); lena:=length(n1);lenb:=length(n2); fori:=1tolenadoa[lena-i+1]:=ord(n1)-ord('0'); fori:=1tolenbdob[lenb-i+1]:=ord(n2)-ord('0'); fori:=1tolenadobegin x:=0; forj:=1tolenbdo{對乘數的每一位進行處理}begin x:=a[j]*b[j]+xdiv10+c;{當前乘積+上次乘積進位+原數} c:=xmod10; end; c:=xdiv10;{進位} end; lenc:=i+j; while(c[lenc]=0)and(lenc>1)dodec(lenc);{最高位的0不輸出} fori:=lencdownto1dowrite(c); writeln; end.
高精度除法
算法一
procedurehigh_devide(a,b:hp;varc,d:hp); var i,len:integer; begin fillchar(c,sizeof(c),0); fillchar(d,sizeof(d),0); len:=a[0];d[0]:=1; fori:=lendownto1dobegin multiply(d,10,d); d[1]:=a[i]; while(compare(d,b)>=0)do{即d>=b} begin Subtract(d,b,d); inc(c[i]); end; end; while(len>1)and(c.s[len]=0)dodec(len); c.len:=len; end;
算法二
fillchar(s,sizeof(s),0);{小數部分初始化} fillchar(posi,sizeof(posi),0);{小數值的位序列初始化} len←0;st←0;{小數部分的指針和 循環節的首指針初始化} read(x,y);{讀 被除數和 除數} write(xdivy);{輸出 整數部分} x←xmody;{計算x除以y的 餘數} ifx=0thenexit;{若x 除盡y,則成功退出} whilelenlimitdo{若小數位未達到上限,則循環} begin inc(len);posix←len;{記下當前位小數,計算下一位小數和餘數} x←x*10;slen←xdivy;x←xmody; ifposix0{若下一位餘數先前出現過,則先前出現的位置為 循環節的開始} thenbeginst←posix;break;end;{then} ifx=0thenbreak;{若除盡,則成功退出} end;{ while} iflen=0 thenbeginwriteln;exit;end;{若小數部分的位數為0,則成功退出;否則輸出小數點} write(.); ifst=0{若無循環節,則輸出小數部分,否則輸出循環節前的小數和循環節} thenfori←1tolendowrite(s) elsebegin fori←1tost-1dowrite(s); write(); fori←sttolendowrite(s); write(); end;{else}
高精度算法C++
無符號高精度整數
#include<iostream> #include<vector> #include<string> using namespace std; struct Wint:vector<int>//用標準庫vector做基類,完美解決位數問題,同時更易於實現 { //將低精度轉高精度的初始化,可以自動被編譯器調用 //因此無需單獨寫高精度數和低精度數的運算函數,十分方便 Wint(int n=0)//默認初始化為0,但0的保存形式為空 { push_back(n); check(); } Wint& check()//在各類運算中經常用到的進位小函數,不妨內置 { while(!empty()&&!back())pop_back();//去除最高位可能存在的0 if(empty())return *this; for(int i=1; i<size(); ++i) { (*this)[i]+=(*this)[i-1]/10; (*this)[i-1]%=10; } while(back()>=10) { push_back(back()/10); (*this)[size()-2]%=10; } return *this;//為使用方便,將進位後的自身返回引用 } }; //輸入輸出 istream& operator>>(istream &is,Wint &n) { string s; is>>s; n.clear(); for(int i=s.size()-1; i>=0; --i)n.push_back(s[i]-'0'); return is; } ostream& operator<<(ostream &os,const Wint &n) { if(n.empty())os<<0; for(int i=n.size()-1; i>=0; --i)os<<n[i]; return os; } //比較,只需要寫兩個,其他的直接代入即可 //常量引用當參數,避免拷貝更高效 bool operator!=(const Wint &a,const Wint &b) { if(a.size()!=b.size())return 1; for(int i=a.size()-1; i>=0; --i) if(a[i]!=b[i])return 1; return 0; } bool operator==(const Wint &a,const Wint &b) { return !(a!=b); } bool operator<(const Wint &a,const Wint &b) { if(a.size()!=b.size())return a.size()<b.size(); for(int i=a.size()-1; i>=0; --i) if(a[i]!=b[i])return a[i]<b[i]; return 0; } bool operator>(const Wint &a,const Wint &b) { return b<a; } bool operator<=(const Wint &a,const Wint &b) { return !(a>b); } bool operator>=(const Wint &a,const Wint &b) { return !(a<b); } //加法,先實現+=,這樣更簡潔高效 Wint& operator+=(Wint &a,const Wint &b) { if(a.size()<b.size())a.resize(b.size()); for(int i=0; i!=b.size(); ++i)a[i]+=b[i]; return a.check(); } Wint operator+(Wint a,const Wint &b) { return a+=b; } //減法,返回差的絕對值,由於後面有交換,故參數不用引用 Wint& operator-=(Wint &a,Wint b) { if(a<b)swap(a,b); for(int i=0; i!=b.size(); a[i]-=b[i],++i) if(a[i]<b[i])//需要借位 { int j=i+1; while(!a[j])++j; while(j>i) { --a[j]; a[--j]+=10; } } return a.check(); } Wint operator-(Wint a,const Wint &b) { return a-=b; } //乘法不能先實現*=,原因自己想 Wint operator*(const Wint &a,const Wint &b) { Wint n; n.assign(a.size()+b.size()-1,0); for(int i=0; i!=a.size(); ++i) for(int j=0; j!=b.size(); ++j) n[i+j]+=a[i]*b[j]; return n.check(); } Wint& operator*=(Wint &a,const Wint &b) { return a=a*b; } //除法和取模先實現一個帶餘除法函數 Wint divmod(Wint &a,const Wint &b) { Wint ans; for(int t=a.size()-b.size(); a>=b; --t) { Wint d; d.assign(t+1,0); d.back()=1; Wint c=b*d; while(a>=c) { a-=c; ans+=d; } } return ans; } Wint operator/(Wint a,const Wint &b) { return divmod(a,b); } Wint& operator/=(Wint &a,const Wint &b) { return a=a/b; } Wint& operator%=(Wint &a,const Wint &b) { divmod(a,b); return a; } Wint operator%(Wint a,const Wint &b) { return a%=b; } //順手實現一個快速冪,可以看到和普通快速冪幾乎無異 Wint pow(const Wint &n,const Wint &k) { if(k.empty())return 1; if(k==2)return n*n; if(k.front()%2)return n*pow(n,k-1); return pow(pow(n,k/2),2); } //通過重載運算符,還可以實現++、--、^、!、邏輯運算符等很多運算,十分簡單,此處都不寫了 int main()//你完全可以像int一般便捷地使用Wint,如下 { Wint a,b; //可以把b改成int型,仍能正常使用 cin>>a>>b; cout<<(a<b)<<endl <<(a==b)<<endl <<a+b<<endl <<a-b<<endl <<a*b<<endl <<a/b<<endl <<a%b<<endl <<pow(a,b); }
帶符號高精度浮點數
#include<bits/stdc++.h> using namespace std; struct Wint:deque<int> { Wint(int n=0) { push_back(n); check(); } Wint& check() { while(!empty()&&!back())pop_back(); if(empty())return *this; for(register unsigned int i=1; i<size(); ++i) { (*this)[i]+=(*this)[i-1]/10; (*this)[i-1]%=10; } while(back()>=10) { push_back(back()/10); (*this)[size()-2]%=10; } return *this; } }; ostream& operator<<(ostream &os,const Wint &n) { if(n.empty())os<<0; for(int i=n.size()-1; i>=0; --i)os<<n[i]; return os; } bool operator!=(const Wint &a,const Wint &b) { if(a.size()!=b.size())return 1; for(int i=a.size()-1; i>=0; --i) if(a[i]!=b[i])return 1; return 0; } bool operator==(const Wint &a,const Wint &b) { return !(a!=b); } bool operator<(const Wint &a,const Wint &b) { if(a.size()!=b.size())return a.size()<b.size(); for(int i=a.size()-1; i>=0; --i) if(a[i]!=b[i])return a[i]<b[i]; return 0; } bool operator>(const Wint &a,const Wint &b) { return b<a; } bool operator<=(const Wint &a,const Wint &b) { return !(a>b); } bool operator>=(const Wint &a,const Wint &b) { return !(a<b); } Wint& operator+=(Wint &a,const Wint &b) { if(a.size()<b.size())a.resize(b.size()); for(register unsigned int i=0; i!=b.size(); ++i)a[i]+=b[i]; return a.check(); } Wint operator+(Wint a,const Wint &b) { return a+=b; } Wint& operator-=(Wint &a,Wint b) { if(a<b)swap(a,b); for(register unsigned int i=0; i!=b.size(); a[i]-=b[i],++i) if(a[i]<b[i]) { register unsigned int j=i+1; while(!a[j])++j; while(j>i) { --a[j]; a[--j]+=10; } } return a.check(); } Wint operator-(Wint a,const Wint &b) { return a-=b; } Wint operator*(const Wint &a,const Wint &b) { Wint n; n.assign(a.size()+b.size()-1,0); for(register unsigned int i=0; i!=a.size(); ++i) for(register unsigned int j=0; j!=b.size(); ++j) n[i+j]+=a[i]*b[j]; return n.check(); } Wint& operator*=(Wint &a,const Wint &b) { return a=a*b; } Wint divmod(Wint &a,const Wint &b) { Wint ans; for(int t=a.size()-b.size(); a>=b; --t) { Wint d; d.assign(t+1,0); d.back()=1; Wint c=b*d; while(a>=c) { a-=c; ans+=d; } } return ans; } Wint operator/(Wint a,const Wint &b) { return divmod(a,b); } Wint& operator/=(Wint &a,const Wint &b) { return a=a/b; } Wint& operator%=(Wint &a,const Wint &b) { divmod(a,b); return a; } Wint operator%(Wint a,const Wint &b) { return a%=b; } Wint pow(const Wint &n,const Wint &k) { if(k.empty())return 1; if(k==2)return n*n; if(k.front()%2)return n*pow(n,k-1); return pow(pow(n,k/2),2); } //=======以下采用上一個高精度無符號整數的模板,編寫的帶符號浮點數高精度模板========// constexpr int AC=5;//輸出小數點後位數 constexpr int DisplayA=-AC,CalA=floor(sqrt(AC)+0.1)*AC;//為了方便後續表示的常量,前一個是顯示的最小指數;後一個是計算精確度,理論上越高越準確,速度越慢 struct Wfloat { int s,e;//s符號,e指數 Wint f;//f有效數字 Wfloat& check() {//內置進位、去0、精度檢查函數 f.check(); while(!f.empty()&&!f.front()) { f.pop_front(); ++e; } if(f.empty()) { s=0; f.push_back(0); e=0; } if(e<-(CalA+1)) { e+=CalA+1; f/=pow((Wint)10,-e); e=-(CalA+1); } return *this; } Wfloat(double n=0) {//初始化函數,避免未定義 s=e=0; check(); } Wfloat& operator=(const string &x) {//內置賦值函數,使用string字符串進行賦值,支持正負號和小數點,例如:Wfloat a;string s="-1.234";a=s; register int n=0; e=0; s=1; f.clear(); if(x=="0") { s=0; f.push_back(0); return *this; } for(register unsigned int i=x.size()-1; i>0; --i) { if(x[i]!='.')f.push_back(x[i]-'0'); else n=i; } switch(x[0]) { case '-': s=-1; break; case '+': s=1; break; default: f.push_back(x[0]-'0'); } e=n?(n-f.size()-1):0; return (*this).check(); } }; //大小比較,不等於和小於直接寫,其他的套殼 bool operator!=(const Wfloat &a,const Wfloat &b) { if(a.s!=b.s)return true; if(a.e!=b.e)return true; if(a.f!=b.f)return true; return false; } bool operator==(const Wfloat &a,const Wfloat &b) { return !(a!=b); } bool operator<(const Wfloat &a,const Wfloat &b) { if(a.s!=b.s)return a.s<b.s; if(a.e==b.e)return a.f<b.f; Wint tmp; if(a.e>b.e) { tmp=a.f; for(register int i=0; i<a.e-b.e; ++i)tmp.push_front(0); return tmp<b.f; } else { tmp=b.f; for(register int i=0; i<b.e-a.e; ++i)tmp.push_front(0); return a.f<tmp; } } bool operator>(const Wfloat &a,const Wfloat &b) { return b<a; } bool operator<=(const Wfloat &a,const Wfloat &b) { return !(a>b); } bool operator>=(const Wfloat &a,const Wfloat &b) { return !(a<b); } Wfloat abs(Wfloat n) {//絕對值函數 n.s=1; return n; } ostream& operator<<(ostream &os,const Wfloat &n) {//輸出函數 if(n.s==0||n.f==0) { os<<0; return os; } if(n.s==-1)os<<'-'; Wint t,s; if(n.e<0) { Wint x; x.push_back(1); for(register int i=0; i<-n.e; ++i)x.push_front(0); register unsigned int flag=0; if(x<n.f) { t=n.f/x; s=n.f-t*x; } else { t=0; s=n.f; flag=x.size()-n.f.size(); } if(n.e<DisplayA) { while(s.size()>(unsigned)AC+1)s.pop_front(); if(s.front()>4)++(*(s.begin()+1)); s.pop_front(); x.clear(); x.push_back(1); for(register int i=0; i<AC; ++i)x.push_front(0); s.check(); while(s>=x) { s-=x; t+=1; } } for(register unsigned int i=1; i<flag; ++i)s.push_back(0); while(!s.empty()&&!s.front())s.pop_front(); os<<t; if(!s.empty())os<<'.'<<s; } else if(n.e==0) { os<<n.f; } else { t=n.f*pow((Wint)10,n.e); os<<t; } return os; } //+-*/ Wfloat& operator+=(Wfloat &a,const Wfloat &b) { if(a.s==0) a=b; else if(b.s==0) return a; else if(a.s==b.s) if(a.e==b.e) a.f+=b.f; else if(a.e<b.e) a.f+=b.f*pow((Wint)10,b.e-a.e); else { a.f=a.f*pow((Wint)10,a.e-b.e)+b.f; a.e=b.e; } else { a.s=(abs(a)>abs(b))?a.s:b.s; if(a.e==b.e) a.f-=b.f; else { Wint tmp; if(a.e<b.e) { tmp=b.f; for(register int i=0; i<b.e-a.e; ++i)tmp.push_front(0); a.f-=tmp; } else { tmp=a.f; for(register int i=0; i<a.e-b.e; ++i)tmp.push_front(0); a.f=tmp-b.f; a.e=b.e; } } } return a.check(); } Wfloat operator+(Wfloat a,const Wfloat &b) { return a+=b; } Wfloat& operator-=(Wfloat &a,Wfloat b) { b.s=-b.s; return a+=b; } Wfloat operator-(const Wfloat &a,Wfloat b) { b.s=-b.s; return a+b; } Wfloat& operator*=(Wfloat &a,const Wfloat &b) { a.s=a.s*b.s; a.e+=b.e; a.f*=b.f; return a.check(); } Wfloat operator*(Wfloat a,const Wfloat &b) { return a*=b; } Wfloat& operator/=(Wfloat &a,const Wfloat &b) { a.s=a.s*b.s; a.e-=CalA; for(register unsigned int i=0; i<CalA; ++i)a.f.push_front(0); a.f/=b.f; return a.check(); } Wfloat operator/(Wfloat a,const Wfloat &b) { return a/=b; } void f(const Wfloat &a) {//指數表示法函數 cout<<a.s<<' '<<a.f<<'E'<<a.e<<endl; } //也可以使用一下的define版,能直接cout<<f(a)輸出指數表示法 //#define f(a) (a.s==-1?'-':'\0')<<a.f<<'E'<<a.e int main() { //使用樣例 Wfloat a,b; string s; cin>>s; a=s; f(a); //cout<<f(a)<<endl; cin>>s; b=s; f(b); //cout<<f(b)<<endl; cout<<a+b<<' '<<flush; cout<<a-b<<' '<<flush; cout<<a*b<<' '<<flush; cout<<a/b<<' '<<endl; return 0; }
傳統樸素字符串
//更簡單的做法(高精度加法) #include <iostream> #include <cstring> using namespace std; char a[1001],b[1001]; int x[1001],y[1001],s[1001]; int main() { int i,la,lb; cin>>a>>b; la=strlen(a); lb=strlen(b); for(i=0;i<la;i++) { x[i]=a[la-1-i]-48; } for(i=0;i<lb;i++) { y[i]=b[lb-1-i]-48; } int temp; for(i=0;i<1001;i++) { temp=x[i]+y[i]+s[i]; if(temp>=10) { s[i+1]++; s[i]=temp-10; } else { s[i]=temp; } } for(i=1001;i>=0;i--) { if(s[i]!=0) { break; } } for(i=i;i>=0;i--) { cout<<s[i]; } cout<<endl; return 0; } //更簡單的做法(高精度減法) #include <iostream> #include <cstring> using namespace std; char a[1001],b[1001]; int x[1001],y[1001],s[1001]; int main() { int i,la,lb; cin>>a>>b; la=strlen(a); lb=strlen(b); for(i=0;i<la;i++) { x[i]=a[la-1-i]-48; } for(i=0;i<lb;i++) { y[i]=b[lb-1-i]-48; } int temp; for(i=0;i<1001;i++) { temp=x[i]+y[i]+s[i]; if(temp>=10) { s[i+1]++; s[i]=temp-10; } else { s[i]=temp; } } for(i=1001;i>=0;i--) { if(s[i]!=0) { break; } } for(i=i;i>=0;i--) { cout<<s[i]; } cout<<endl; return 0; } //更簡單的做法(高精度乘法) #include <iostream> #include <cstring> using namespace std; char a[1001],b[1001]; int x[1001],y[1001],s[2001]; int main() { int i,la,j,lb; cin>>a>>b; la=strlen(a); lb=strlen(b); for(i=0;i<la;i++) { x[i]=a[la-1-i]-48; } for(i=0;i<lb;i++) { y[i]=b[lb-1-i]-48; } for(i=0;i<la;i++) { for(j=0;j<lb;j++) { s[i+j]=s[i+j]+x[i]*y[j]; } } for(i=0;i<2001;i++) { s[i+1]=s[i+1]+s[i]/10; s[i]=s[i]%10; } for(i=2000;i>=0;i--) { if(s[i]!=0) { break; } } for(i=i;i>=0;i--) { cout<<s[i]; } cout<<endl; return 0; }
高精度算法C
算法一
#include<stdio.h> #include<string.h> #define MAXLEN 200 //設置數的最大長度 int main(){ int a[MAXLEN+10],b[MAXLEN+10],len1,len2,c[2*MAXLEN+10],i,j; char str1[MAXLEN+10],str2[MAXLEN+10]; for(i=0;i<MAXLEN+10;i++)a[i]=b[i]=0;//將a,b兩個數組都置為零 for(i=0;i<2*MAXLEN+10;i++)c[i]=0;//將c置為零 // scanf("%s%s",str1,str2); gets(str1); gets(str2);//以字符的形式讀入兩個乘數 len1=strlen(str1); len2=strlen(str2); for(i=len1-1,j=0;i>=0;i--)//將字符型數轉換成數字,低位存在數組的低位(倒置) a[j++]=str1[i]-'0';//字符型減去'0'的ASCIII碼值轉換為數字 for(i=len2-1,j=0;i>=0;i--) b[j++]=str2[i]-'0';//同上 for(i=0;i<len2;i++)//循環相乘,用第二個數的每一位去乘以第一個數,a的第i位乘以b的第j位之後存在c的第i+j位上 for(j=0;j<len1;j++) c[i+j]+=b[i]*a[j]; for(i=0;i<len1+len2+2;i++)//處理進位問題,如果大於10,則進位 if(c[i]>=10){ c[i+1]+=c[i]/10; c[i]%=10; } for(i=len1+len2+2;(c[i]==0)&&(i>=0);i--);//過濾掉高位的數字零,使之不輸出 if(i>=0) for(;i>=0;i--) printf("%d",c[i]); else printf("0"); printf("\n"); return 0; }
算法二
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<malloc.h> int an,bn,fa=1,fb=1; /*把an,bn,k設為全局變量,an紀錄第一個高精度數組的位數,bn紀錄第二個高精度數組的位數,k紀錄輸出結果的位數*/ char b1[250],b2[250];/*紀錄需要計算的兩個高精度數據*/ void input(int a1[],int a2[]) { /*函數input為輸入函數,用來紀錄兩個待計算的高精度數據,以數組首地址為參數.以實現返回兩個高精度數據*/ int i,ai=1,bi=1; scanf("%s%s",b1,b2);/*輸入兩個高精度數據*/ an= strlen(b1);/*an紀錄b1的位數*/ bn=strlen(b2);/*bn紀錄b2的位數*/ if(b1[0]==45){an--;fa=-1;ai=0;}/*判斷數組的符號*/ if(b2[0]==45){bn--;fb=-1;bi=0;} for(i=0;i<an;i++,ai++){a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字符形數據b1轉為整數形數據,同樣用數組紀錄*/ for(i=0;i<bn;i++,bi++)a2[i]=b2[bn-bi]-'0';/*同上*/ return; } void subtraction(int a[],int b[],int q); void addition(int a[],int b[],int q)/*高精度加法運算*/ { int i,c[251]={0},k; if(fa*fb>0||q) { if(an>bn) k=an; else k=bn;/*用k紀錄結果的最小位數*/ for(i=0;i<k;i++) { c[i]=a[i]+b[i]+c[i]; c[i+1]=(int)c[i]/10; c[i]=(int)c[i]%10; }/* 高精度加法運算過程*/ if(c[k])k++;/*判斷最後結果的位數*/ if(fa<0&&q||fa<0) printf("-"); for(i=k-1;i>=0;i--)printf("%d",c[i]);/*輸出結果*/ return; } else subtraction(a,b,1); return; } void subtraction(int a[],int b[],int q)/* 高精度減法運算*/ { int i,f=0,c[251]={0},k; if(fa*fb>0||q) { if(an>bn) k=an; else/*用k紀錄結果的最大位數*/ { k=bn; for(i=k;a[i]<=b[i]&&i>=0;i--) if(a[i]<b[i])f=1;/*f紀錄結果符號*/ } if(!f)/*高精度減法運算過程*/ for(i=0;i<k;i++) { if(a[i]<b[i]) {a[i+1]--; a[i]+=10; } c[i]=a[i]-b[i]; } else/*當a<b時的處理*/ for(i=0;i<k;i++) { if(b[i]<a[i]) {b[i+1]--; b[i]+=10; } c[i]=b[i]-a[i]; } while(!c[k-1]&&k>1)k--;/*判斷最後結果的位數*/ if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-");/*如果f為真是輸出負號*/ for(i=k-1;i>=0;i--)printf("%d",c[i]); return; } else addition(a,b,1); } void multiplication(int a[],int b[])/* 高精度乘法運算*/ { int i,j,c[501]={0},k; k=an+bn-1;/*用k紀錄結果的最大位數*/ for(i=0;i<an;i++)/*高精度乘法運算過程*/ for(j=0;j<bn;j++) { c[i+j]=a[i]*b[j]+c[i+j]; c[i+j+1]=c[i+j]/10+c[i+j+1]; c[i+j]=c[i+j]%10; } while(!c[k])k--;/*判斷最後結果的位數*/ if(fa*fb<0) printf("-"); for(i=k;i>=0;i--)printf("%d",c[i]);/*輸出結果*/ } int main() { int a[250]={0},b[250]={0}; input(a,b); printf("\n%s+%s=",b1,b2); addition(a,b,0); printf("\n%s-%s=",b1,b2); subtraction(a,b,0); printf("\n%s*%s=",b1,b2); multiplication(a,b); system("pause"); return 0; }
高精度算法Python
Python整數基本運算就是高精度計算,不用特殊處理
高精度算法Java
Java內部寫好了高精度運算,只需要使用BigInteger類或者BigDecimal類即可
//高精度A+B import java.util.Scanner; import java.math.BigInteger; public class plus { private static Scanner in = new Scanner(System.in); public static void main(String[] args) { System.out.println( in.nextBigInteger().add(in.nextBigInteger()) ); } }