高精度加减乘法
zhangyuqiTAT · · 个人记录
#include<bits/stdc++.h>
using namespace std;
void jf(string a,string b){
int an[1000]={0},bn[1000]={0};
int lena=a.size(),lenb=b.size();
int lenmax=max(lena,lenb);
for(int i=0;i<lena;i++){
an[i]=a[lena-i-1]-'0';
}
for(int i=0;i<lenb;i++){
bn[i]=b[lenb-i-1]-'0';
}
for(int i=0;i<lenmax;i++){
an[i]+=bn[i];
if(an[i]>=10){
an[i]%=10;
an[i+1]+=1;
}
}
if(an[lenmax]!=0)lenmax++;
for(int i=lenmax-1;i>=0;i--){
cout<<an[i];
}
}
void gao_jing_du_jian_fa(string a,string b){
int an[1000],bn[1000];
int lena=a.size(),lenb=b.size();
int len=max(lena,lenb);
bool f;
if(lena==lenb){
if(a>b)f=0;
else f=1;
}
else{
if(len==lena)f=0;
else f=1;
}
if(f)swap(a,b);
for(int i=0;i<lena;i++){
an[i]=a[lena-i-1]-'0';
}
for(int i=0;i<lenb;i++){
bn[i]=b[lenb-i-1]-'0';
}
for(int i=0;i<len;i++){
an[i]-=bn[i];
if(an[i]<0){
an[i]+=10;
an[i+1]-=1;
}
}
while(an[len-1]==0&&len>1)len--;
if(f)cout<<"-";
for(int i=len-1;i>=0;i--)cout<<an[i];
}
void gao_jing_du_cheng_fa(string a1,string b1){
int a[1000]={0},b[1000]={0},c[1000]={0};
int lena=a1.size(),lenb=b1.size();
for(int i=lena-1;i>=0;i--){
a[i]=a1[lena-1-i]-'0';
}
for(int i=lenb-1;i>=0;i--){
b[i]=b1[lenb-1-i]-'0';
}
for(int i=0;i<lena;i++){
for(int j=0;j<lenb;j++){
c[i+j]+=a[i]*b[j];
}
}
int len_sum=lena+lenb;
for(int i=0;i<len_sum;i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[len_sum-1]>=10){
c[len_sum]+=c[len_sum-1]/10;
c[len_sum-1]%=10;
len_sum++;
}
while(c[len_sum-1]==0&&len_sum>1)len_sum--;
string ans="";
for(int i=0;i<len_sum;i++){
ans+=c[i]+'0';
}
for(int i=len_sum-1;i>=0;i--){
cout<<ans[i];
}
}
int main(){
string a,b;
char c;
cin>>a>>c>>b;
if(c=='+'){
jf(a,b);
}else if(c=='-'){
gao_jing_du_jian_fa(a,b);
}else if(c=='*'){
gao_jing_du_cheng_fa(a,b);
}
return 0;
}