本人整理并编写高精度四则运算,以函数形式供大家参考
考虑到看此文章者多是初学者,全部以 char 型数组编写
加法
void pplus(char s1[],char s2[]){//加法
int a1[4005],a2[2005];
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
int l=min(strlen(s1),strlen(s2));
int l_max=max(strlen(s1),strlen(s2));
for(int i=0;i<strlen(s1);i++){
a1[i]=s1[strlen(s1)-i-1]-'0';
}
for(int i=0;i<strlen(s2);i++){
a2[i]=s2[strlen(s2)-i-1]-'0';
}
int jw=0;
for(int i=0;i<=4005;i++){
a1[i]+=a2[i]+jw;
jw=a1[i]/10;
a1[i]%=10;
}
bool flag=0;
for(int i=l_max;i>=0;i--){
if(a1[i]!=0||i==0) flag=true;
if(flag) cout<<a1[i];
}
}
减法
bool Dayu(char s1[],char s2[]){//判断s1总值是否大于等于s2
int a[2005],b[2005];
if(strlen(s1)>=strlen(s2)) return true;
else return false;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<strlen(s1);i++){
a[i]=s1[i]-'0';
}
for(int i=0;i<strlen(s2);i++){
b[i]=s2[i]-'0';
}
if(strlen(s1)==strlen(s2)){
for(int i=0;i<strlen(s1);i++){
if(a[i]<b[i]) return false;
else if(a[i]>b[i]) return true;
}
}
return true;
}
void mminus(char s1[],char s2[]){//减法
int a1[2005],a2[2005];
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
for(int i=0;i<strlen(s1);i++){
a1[i]=s1[strlen(s1)-i-1]-'0';
}
for(int i=0;i<strlen(s2);i++){
a2[i]=s2[strlen(s2)-i-1]-'0';
}
//判断大小
if(Dayu(s1,s2)){//s1>=s2
for(int i=0;i<2000;i++){
a1[i]=a1[i]-a2[i];
if(a1[i]<0) {
a1[i]+=10;
a1[i+1]--;
}
}
bool flag=0;
for(int i=strlen(s1);i>=0;i--){
if(a1[i]!=0||i==0) flag=true;
if(flag) cout<<a1[i];
}
}else{//s1<s2
cout<<"-";
for(int i=0;i<2000;i++){
a2[i]=a2[i]-a1[i];
if(a2[i]<0) {
a2[i]+=10;
a2[i+1]--;
}
}
bool flag=0;
for(int i=max(strlen(s1),strlen(s2));i>=0;i--){
if(a2[i]!=0||i==0) flag=true;
if(flag) cout<<a2[i];
}
}
}
乘法
void mul(char s1[],char s2[]){//乘法
int a1[2005],a2[2005];
int ans[5005];
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(ans,0,sizeof(ans));
for(int i=0;i<strlen(s1);i++){
a1[i]=s1[strlen(s1)-i-1]-'0';
}
for(int i=0;i<strlen(s2);i++){
a2[i]=s2[strlen(s2)-i-1]-'0';
}
for(int i=0;i<=strlen(s1);i++){
for(int j=0;j<=strlen(s2);j++){
ans[i+j]+=a1[i]*a2[j];
if(ans[i+j]>=10){
ans[i+j+1]+=ans[i+j]/10;
ans[i+j]%=10;
}
}
}
bool flag=0;
for(int i=strlen(s1)+strlen(s2)+1;i>=0;i--){
if(ans[i]!=0||i==0) flag=true;
if(flag) cout<<ans[i];
}
}
除法 (初学者掌握大数除小数即可)
void div(char s1[],int s2){//大数除小数,结果向下取整
int a[2005];
int ans[2005];
memset(a,0,sizeof(a));
for(int i=0;i<strlen(s1);i++){
a[i]=s1[i]-'0';
}
int jw=0;
for(int i=0;i<strlen(s1);i++){
jw=jw*10+a[i];
ans[i]=jw/s2;
jw=jw%s2;
}
bool flag=0;
for(int i=0;i<strlen(s1);i++){
if(ans[i]!=0) flag=true;
if(flag) cout<<ans[i];
}
}
主函数
int main(){
cin>>str1>>str2;
//mminus(str1,str2);
//mul(str1,str2);
//pplus(str1,str2);
//div(str1,b); 自选
return 0;
}
主要思想大致一样,都是模拟竖式运算。