高精度减法。
两个整数 a,b(第二个可能比第一个大)。
结果(是负数要输出负号)。
2
1
1
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
-
- const int MAXSIZE = 10100;
-
- string stra,strb;
- int a[MAXSIZE],b[MAXSIZE],c[MAXSIZE];
-
- //模拟竖式运算
- int reduce(int a[],int b[]){
- int i(0);
- while(i<=stra.length() || i<= strb.length()){
- c[i] = a[i] - b[i];
- if(c[i]<0){ //如果c[i]<0 说明需要向高位借1
- a[i+1]--; //高位减1
- c[i] += 10; //当前位+10
- }
- i++;//位数+1
- }
- return i;
- }
-
- //倒序将字符串存储到int数组中
- void init(string s,int n[]){
- for(int i = s.length()-1;i>=0;i--)
- n[i] = s[s.length()-i-1]-'0';
- }
-
- //打印结果
- void print(int a[],int b[]){
- int n = reduce(a,b);
- bool isOut(false);//判断符号,控制是否输出
- for(int i = n-1;i>=0;i--){
- if(!isOut && c[i] == 0) continue;//如果没有读取到第一个不为0的数字,则不输出
- //例如54321-54312,进行该运算时c[]={9,0,0,0,0}
- //倒序输出为00009,而我们不需要前面的0,所以应该从第一个不为0的数字开始输出
- isOut = true;
- cout<<c[i];
- }
- if(!isOut) cout<<0;//如果循环结束仍未读取到不为0的数字,则输出0
- }
-
-
- int main(){
- cin>>stra>>strb;
-
- //特判,如果a<b 需要交换a与b,同时输出负号
- //被减数应为大的数
- if(stra.length()<strb.length() ||
- (stra.length()==strb.length() && stra<strb)){
- string temp = stra;
- stra = strb;
- strb = temp;
- cout<<"-";
- }
- init(stra,a);
- init(strb,b);
- print(a,b);
-
- return 0;
- }
-