1.高精度算法的概念
高精度算法是处理大数字的数学计算方法,一般几位或者十几位数字,我们可以进行计算,但如果是几百位甚至是几千位数字,我们就要用高精度算法进行计算,但往往这个算法不会单独进行考察,而是和其他算法一起考。
2.高精度算法的思路
就是用字符数组进行模拟存储,当输入的数很长时,可采用字符串输入,再将每一位转化为int 类型存入int类型数组中,然后,遍历int数组进行计算,如果当前这一位经过计算大于10,那么就要向上进一位(a[i+1]=a[i]/10),当前这一位就要对10取模(a[i]=a[i]%10),最后,用一个循环去除前导零(自己可以进行一下计算,最后有可能会有前导零)。
2.1高精度加法
#include<iostream> //高精度加法
#include<string>
using namespace std;
int a[505],b[505],c[505];
int main(){
int la,lb,lc;
string s1,s2;
cin>>s1;
cin>>s2;
la=s1.size();
lb=s2.size();
for(int i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(int i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
lc=max(la,lb)+1;
for(int i=1;i<=lc;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[lc]==0&&lc>0)
lc--;
for(int i=lc;i>0;i--)
printf("%d",c[i]);
}
解释:定义两个字符串,代表两个数,再用两个int数组转置存储,这样方便两数进行计算,
for(int i=1;i<=lc;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
//进行进位处理
}
if(c[lc]==0&&lc>0)
lc--; //去除前导零
2.1高精度减法
和高精度加法类似
#include<iostream> //高精度减法
#include<string>
using namespace std;
int a[10090],b[10090],c[10090];
int main(){
string a1,b1;
cin>>a1;
cin>>b1;
int n=a1.size(),t=b1.size();
for(int i=0;i<n;i++)
a[i]=a1[n-i-1]-'0';
for(int i=0;i<t;i++)
b[i]=b1[t-i-1]-'0';
if(t>n||(t==n&&b1>a1)){
swap(a,b);
cout<<"-";
//如果b的长度大于a(说明b大于a),就进行交换,
//输出 -
}
int m=max(n,t);
for(int i=0;i<m;i++){
c[i]+=a[i]-b[i];
if(c[i]<0){
c[i+1]--;
c[i]+=10;
}
}
m--;
while(c[m]==0&&m>0) //(减法)是while
m--;
for(int i=m;i>=0;i--)
cout<<c[i];
}
1.3高精度乘法
#include<iostream> //高精度乘法
#include<string>
using namespace std;
int a[20005],b[20005],c[20005];
int main(){
string a1,b1;
cin>>a1;
cin>>b1;
int n=a1.size(),t=b1.size(),i,j;
for(i=0;i<n;i++)
a[i]=a1[n-i-1]-'0';
for(i=0;i<t;i++)
b[i]=b1[t-i-1]-'0';
for(i=0;i<n;i++){
for(j=0;j<t;j++){
c[i+j]+=a[i]*b[j];
}
}
int m=n+t; //(乘法)n+t
for(i=0;i<m;i++){
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
while(m>0&&c[m]==0)
m--;
for(i=m;i>=0;i--)
cout<<c[i];
}
1.4高精度除法
要开long long 数组
#include<iostream> //除法
#include<string>
using namespace std;
long long a[50010],c[50010];
int main()
{
string str;
long long lena,lenc;
long long x=0,b;
int i;
cin>>str;
cin>>b;
lena=str.size();
for(i=0;i<lena;i++)
a[i+1]=str[i]-'0';
for(i=1;i<=lena;i++)
{
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lenc=1;
while(c[lenc]==0&&lenc<lena)
lenc++;
for(i=lenc;i<=lena;i++)
cout<<c[i];
cout<<endl;
return 0;
}