C++高精度加减乘算法
高精度加法:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
string s1,s2;
int la,lb,lc;
int a[505],b[505],c[505];
void strtoint(string str,int tar[]){
for(int i=0;i<str.size();i++){
tar[str.size()-i]=str[i]-'0';
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>s1>>s2;
strtoint(s1,a); strtoint(s2,b);
la=s1.size(); lb=s2.size(); 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]%=10;
}
bool f=0;
for(int i=lc;i>=1;i--){
if(c[i]!=0) f=1;
if(f) cout<<c[i];
}
if(!f) cout<<0;
return 0;
}
高精度减法:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],b[N],c[N];
int la,lb,lc;
bool cmp(int a[],int b[]){
if(la!=lb) return la>lb;
for(int i=la-1;i>=0;i--){
if(a[i]!=b[i]) return a[i]>b[i];
}
return 1;
}
void sub(int a[],int b[],int c[]){
for(int i=0;i<lc;i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
while(lc&&c[lc]==0) lc--;
}
int main(){
string s1,s2;
cin>>s1>>s2;
la=s1.size(),lb=s2.size(),lc=max(la,lb);
for(int i=la-1;i>=0;i--) a[la-1-i]=s1[i]-'0';
for(int i=lb-1;i>=0;i--) b[lb-1-i]=s2[i]-'0';
if(!cmp(a,b)){
swap(a,b);
cout<<"-";
}
sub(a,b,c);
for(int i=lc;i>=0;i--) cout<<c[i];
return 0;
}
高精度乘法:
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int a[N],b[N],c[N];
int la,lb,lc;
void mul(int a[],int b[],int c[]){
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
while(lc&&c[lc]==0) lc--;
}
int main(){
string s1,s2;
cin>>s1>>s2;
la=s1.size(),lb=s2.size(),lc=la+lb;
for(int i=la-1;i>=0;i--) a[la-1-i]=s1[i]-'0';
for(int i=lb-1;i>=0;i--) b[lb-1-i]=s2[i]-'0';
mul(a,b,c);
for(int i=lc;i>=0;i--) cout<<c[i];
return 0;
}