给大家看个小视频高精度减法_哔哩哔哩_bilibili
基本思想
计算机模拟人类做竖式计算,从而得到正确答案
大家还记得小学时学的“减法竖式”吗?是不是这样
x-y问题
函数总览:
1.converts() 字符串转为高精度大数
2.le() 判断大小
3.sub() 将两个高精度大数相减
4.print() 输出一个高精度大数(删除前导0)
易错点
1.相减为负数时的处理
2.减法借位的处理
3.删除前导0
main()
int x[SIZE],y[SIZE];
int main(){string s1,s2;cin>>s1>>s2;converts(x,s1);converts(y,s2);if(le(y,x)){sub(x,y);print(x);}else{sub(y,x);cout<<"-";print(y);}return 0;
}
le()
bool le(int *a,int *b,int len=SIZE){int i;for(i=len-1;i>=0&&a[i]==b[i];i--);//判断等于 return i<0||a[i]<b[i];
}
方法图示
sub()
void sub(int *a,int *b,int len=SIZE){for(int i=0;i<len;i++)if((a[i]-=b[i])<0){a[i+1]--;a[i]+=10;}
}
借位图示
代码
#include <bits/stdc++.h>
using namespace std;
#define SIZE 550
int x[SIZE],y[SIZE];
void converts(int *a,string s){int i,len=s.size();for(i=0;i<len;i++) a[i]=s[len-i-1]-'0';for(;i<SIZE;i++) a[i]=0;
}
bool le(int *a,int *b,int len=SIZE){int i;for(i=len-1;i>=0&&a[i]==b[i];i--);//判断等于 return i<0||a[i]<b[i];
}
void sub(int *a,int *b,int len=SIZE){for(int i=0;i<len;i++)if((a[i]-=b[i])<0){a[i+1]--;a[i]+=10;}
}
void print(int *a){int i;for(i=SIZE-1;i>0;i--) if(a[i]>0) break;for(;i>=0;i--) cout<<a[i];cout<<endl;
}
int main(){string s1,s2;cin>>s1>>s2;converts(x,s1);converts(y,s2);if(le(y,x)){sub(x,y);print(x);}else{sub(y,x);cout<<"-";print(y);}return 0;
}
希望这些对大家有用,三连必回