收藏
0有用+1
0

高精度算法

数学术语
高精度算法High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘开方等运算。对于非常庞大无法在计算机中正常存储的数字,将这个数字拆开,拆成一位一位或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
中文名
高精度算法
外文名
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()) ); } }