分享一下高精度的基础写法,方便大家的不时之需
高精度加法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
string s1,s2;
int a[10005],b[10005];
int main( ){
cin>>s1>>s2;
int l1=s1.size();
int l2=s2.size();
for(int i=0;i<=l1;i++){
a[l1-i-1]=s1[i]-'0';
}
for(int i=0;i<l2;i++){
b[l2-i-1]=s2[i]-'0';
}
l1=max(l1,l2);
for(int i=0;i<l1;i++){
a[i]+=b[i];
}
for(int i=0;i<l1;i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[l1]){
a[l1+1]=a[l1]/10;
a[l1]%=10;
l1++;
}
for(int i=l1-1;i>=0;i--){
cout<<a[i];
}
return 0;
}
高精度减法(考虑了负数
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int M=10005;
int a[M],b[M],len,len1,len2;
string s1,s2;
int main(){
cin>>s1>>s2;
len1=s1.size();
len2=s2.size();
for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-'0';
for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-'0';
len=max(len1,len2);
for(int i=0;i<len;i++) a[i]-=b[i];
for(int i=0;i<len;i++){
while(a[i]<0){
a[i+1]--;
a[i]+=10;
}
}
while(a[len-1]==0&&len>1) len--;
for(int i=len-1;i>=0;i--) cout<<a[i];
return 0;
}
高精度除法
#include<cstdio>
#include<cstring>
using namespace std;
const int m=10000;
char s1[m];
long long b,c[m],x,a[m],la,lc;
int main(){
scanf("%s %lld",s1,&b);
la=strlen(s1);
for(int i=1;i<=la;i++) a[i]=s1[i-1]-'0';
for(int i=1;i<=la;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lc=1;
while(c[lc]==0&&lc<la) lc++;
for(int i=lc;i<=la;i++) printf("%lld",c[i]);
}
高精度乘法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
char s1[2005],s2[2005];
int a[2005],b[2005],c[4005];
int main( ){
int la,lb,lc;
cin>>s1>>s2;
la=strlen(s1);
lb=strlen(s2);
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';
if(a[la]==0||b[lb]==0){
cout<<0;
return 0;
}
lc=la+lb;
for(int i=1;i<=la;i++) {
for(int j=1;j<=lb;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
if(c[lc]==0&&lc>0) lc--;
for(int i=lc;i>0;i--)
printf("%d",c[i]);
return 0;
}
==orz==
这里展示的只是基础代码,码风并不十分优美,但很好理解(只是我觉得,毕竟是我这个蒟蒻写的,大佬们一定都会QWQ