高精度模板,大家可以收藏一下,遇到题目的时候可以派上用场。
高精度加法
#include<bits/stdc++.h>
using namespace std;
string a1,b1;
int a[101],b[101],c[101],lena,lenb,lenc,x;
int main(){
cin>>a1>>b1;
lena=a1.size();
lenb=b1.size();
for(int i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(int i=1;i<=lenb;i++)b[i]=b1[lenb-i]-48;
lenc=1;
while(lenc<=lena||lenc<=lenb){
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
if(c[lenc]==0)lenc--;
for(int i=lenc;i>=1;i--)cout<<c[i];
}
高精度减法
#include<bits/stdc++.h>
using namespace std;
string a1,b1;
int a[101],b[101],c[101],lena,lenb,lenc;
int strcmp1(string a1,string b1){
if(a1[0]>b1[0])return 1;
else if(a1[0]<b1[0])return -1;
else return 0;
}
int main(){
cin>>a1>>b1;
if(a1.size()<b1.size()||a1.size()==b1.size()&&strcmp1(a1,b1)==0){
swap(a1,b1);
cout<<"-";
}
lena=a1.size();
lenb=b1.size();
for(int i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(int i=1;i<=lenb;i++)b[i]=b1[lenb-i]-48;
lenc=1;
while(lenc<=lena){
if(a[lenc]<b[lenc]){
a[lenc]+=10;
a[lenc+1]--;
}
c[lenc]=a[lenc]-b[lenc];
lenc++;
}
while(c[lenc]==0&&lenc>1)lenc--;
for(int i=lenc;i>=1;i--)cout<<c[i];
}
高精度乘法
#include<bits/stdc++.h>
using namespace std;
string a1,b1;
int a[101],b[101],c[101],lena,lenb,lenc;
int main(){
cin>>a1>>b1;
lena=a1.size();
lenb=b1.size();
for(int i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(int i=1;i<=lenb;i++)b[i]=b1[lenb-i]-48;
for(int i=1;i<=lenb;i++){
int x=0;
for(int j=1;j<=lena;j++){
c[i+j-1]=b[i]*a[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+lena]=x;
}
lenc=lena+lenb;
while(c[lenc]==0&&lenc>1)lenc--;
for(int i=lenc;i>=1;i--)
cout<<c[i];
}
高精度除法
高精度除以低精度
#include<bits/stdc++.h>
using namespace std;
string a1;
int a[101],c[101],lena,lenc,b,x;
int main(){
cin>>a1>>b;
lena=a1.size();
for(int i=0;i<lena;i++)
a[i+1]=a1[i]-'0';
for(int 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(int i=lenc;i<=lena;i++)
cout<<c[i];
}
高精度除以高精度
#include<bits/stdc++.h>
using namespace std;
int a[101],b[101],c[101];
void init(int a[]){
string s;
cin>>s;
a[0]=s.size();
for(int i=1;i<=a[0];i++)a[i]=s[a[0]-i]-'0';
}
void print(int a[]){
if(a[0]==0)cout<<'0'<<endl;
else for(int i=a[0];i>=1;i--)cout<<a[i];
}
int compare(int a[],int b[]){
if(a[0]>b[0])return 1;
if(a[0]<b[0])return -1;
for(int i=a[0];i>=1;i--){
if(a[i]>b[i])return 1;
if(a[i]<b[i])return -1;
}
return 0;
}
void minus_(int a[],int b[]){
int flag=compare(a,b);
if(flag==0)a[0]=0;
if(flag==1){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0)a[0]--;
}
}
void numcpy(int p[],int q[],int det){
for(int i=1;i<=p[0];i++)q[i+det-1]=p[i];
q[0]=p[0]+det-1;
}
void divide_(int a[],int b[],int c[]){
int tmp[101];
c[0]=a[0]-b[0]+1;
for(int i=c[0];i>=1;i--){
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=0){
c[i]++;
minus_(a,b);
}
}
while(c[0]>0&&c[c[0]]==0)c[0]--;
}
int main(){
init(a);
init(b);
divide_(a,b,c);
print(c);
/*
cout<<endl;
print(a);//输出余数。
*/
}