目录
一.概念
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
二.高精度加法代码
#include<bits/stdc++.h>
using namespace std;
int a[205],b[205],c[405];
string add(string as,string bs){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int la=as.size(),lb=bs.size(),lc=max(la,lb)+1;
for(int i=1;i<=la;i++) a[i]=as[la-i]-'0';
for(int i=1;i<=lb;i++) b[i]=bs[lb-i]-'0';
for(int i=1;i<lc;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
while(c[lc]==0&&lc>1) lc--;
string cs;
for(int i=lc;i>=1;i--) cs+=c[i]+'0';
return cs;
}
int main(){
string as,bs;
cin>>as>>bs;
string cs=add(as,bs);
cout<<cs;
return 0;
}
二.高精度减法代码
#include<bits/stdc++.h>
using namespace std;
char as[205],bs[205];
int a[205],b[205],c[405];
string add(char as[],char bs[]){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int la=strlen(as),lb=strlen(bs),lc=max(la,lb)+1;
for(int i=1;i<=la;i++) a[i]=as[la-i]-'0';
for(int i=1;i<=lb;i++) b[i]=bs[lb-i]-'0';
for(int i=1;i<lc;i++){
c[i]+=a[i]-b[i];
if(c[i]<0) c[i+1]-=1,c[i]+=10;
}
while(c[lc]==0&&lc>1) lc--;
string cs;
for(int i=lc;i>=1;i--) cs+=c[i]+'0';
return cs;
}
int main(){
cin>>as>>bs;
string cs;
if(strlen(as)<strlen(bs)||strlen(as)==strlen(bs)&&strcmp(as,bs)==-1){
cout<<'-';
cs=add(bs,as);
}else cs=add(as,bs);
cout<<cs;
return 0;
}
三.高精度乘法
#include<bits/stdc++.h>
using namespace std;
int a[205],b[205],c[405];
string mul(string as,string bs){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int al=as.size(),bl=bs.size(),cl=al+bl;
for(int i=1;i<=al;i++) a[i]=as[al-i]-'0';
for(int i=1;i<=bl;i++) b[i]=bs[bl-i]-'0';
for(int i=1;i<=al;i++){
for(int j=1;j<=bl;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[cl]==0&&cl>0) cl--;
string cs;
for(int i=cl;i>=1;i--) cs+=c[i]+'0';
return cs;
}
int main(){
string as,bs;
cin>>as>>bs;
string cs=mul(as,bs);
cout<<cs;
return 0;
}
四.高精度除低精度
#include<bits/stdc++.h>
using namespace std;
int a[205],b[205],c[405];
string mul(string as,string bs){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int al=as.size(),bl=bs.size(),cl=al+bl;
for(int i=1;i<=al;i++) a[i]=as[al-i]-'0';
for(int i=1;i<=bl;i++) b[i]=bs[bl-i]-'0';
for(int i=1;i<=al;i++){
for(int j=1;j<=bl;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[cl]==0&&cl>0) cl--;
string cs;
for(int i=cl;i>=1;i--) cs+=c[i]+'0';
return cs;
}
int main(){
string as,bs;
cin>>as>>bs;
string cs=mul(as,bs);
cout<<cs;
return 0;
}