基本覆盖全高精度代码(X02推荐)
2023-08-12 10:46:36
发布于:江苏
前言:
这种高精度问题用python做是非常简单的,这里不推荐在洛谷上用python做高精度的题,这里为ACGO点一个大大的赞
1.高精度加法(做a+b problem的时候可以用来装)
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1001],b[1001];
cin>>a>>b;
int A[1001]={0},B[1001]={0},C[1001];
int aln=strlen(a),bln=strlen(b);
int mln=max(aln,bln);
int cnt0=0,cnt1=0;
for(int i=aln-1;i>=0;i--) A[cnt0++]=a[i]-'0';
for(int i=bln-1;i>=0;i--) B[cnt1++]=b[i]-'0';
for(int i=0;i<mln;i++){
C[i]=A[i]+B[i]+C[i];
if(C[i]>=10){
C[i+1]=1;
C[i]%=10;
}
}
if(C[mln]>0) cout<<C[mln];
for(int i=mln-1;i>=0;i--) cout<<C[i];
return 0;
}
2.高精度减法
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int a[N],b[N],c[N];
bool cmp(string s1,string s2){
if(s1.size() < s2.size()) return true;
else if(s1.size() > s2.size()) return false;
else{
if(s1 < s2) return true;
else return false;
}
}
int main(){
string a1,b1;
cin>>a1>>b1;
if(cmp(a1,b1)){
cout<<"-";
swap(a1,b1);
}
int lena=a1.size();
int lenb=b1.size();
for(int i=0;i<lena;i++) a[i]=a1[lena-i-1]-'0';
for(int i=0;i<lenb;i++) b[i]=b1[lenb-i-1]-'0';
int lenc=lena;
for(int i=0;i<lenc;i++){
if(a[i] < b[i]){
a[i] += 10;
a[i+1]--;
}
c[i] = a[i] - b[i];
}
while(lenc>=1 && c[lenc-1]==0) lenc--;
for(int i=lenc-1;i>=0;i--) cout<<c[i];
return 0;
}
3.高精度乘法
#include<bits/stdc++.h>
using namespace std;
int x[2000],y[2100],c[2101];
int main(){
int mx,as,bs,t;
string a,b;
cin>>a>>b;
as=a.size();
bs=b.size();
if(a=="0" or b=="0"){ //特判
cout<<"0";return 0;
}
for(int i=0;i<as;i++) x[i]=a[as-i-1]-'0';
for(int i=0;i<bs;i++) y[i]=b[bs-i-1]-'0';
for(int i=0;i<bs;i++){
for(int j=0;j<as;j++){
c[i+j]+=x[j]*y[i];
if(c[i+j]>=10){
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
}
t=as+bs;
while(t>1 && c[t]==0){
t--;
}
for(int i=t;i>=0;i--) cout<<c[i];
return 0;
}
注:其实还有一种高精小数,这里不算在考虑范围内
这里空空如也
有帮助,赞一个