核心代码:
a[4]a[3]a[2]a[1]
- b[4]b[3]b[2]b[1]
-----------------------------------
c[4]c[3]c[2]c[1]
在这里用数组a与b来保存被减数与减数
1.如果a<b,则交换a与b。(保证被减数始终大于减数,最后在结果加上负号即可)
2.如果a[i]<b[i],那么从高位借1
if (a[i] < b[i]) {
a[i + 1]--;
a[i] = a[i] + 10;
}
c[i] = a[i] - b[i];
实现代码:
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
using namespace std;
char s1[505], s2[505],s3[505];
int a[505], b[505], c[505];
bool compare(char s1[], char s2[]) {
int n = strlen(s1);
int m = strlen(s2);
//如果输入的数长度不一样,比如123与45,很显然123>45,那么n=3,m=2。
//返回3>2,为true,又因为if (!compare(s1, s2)),所以不满足条件,即不交换
if (n != m)
return n > m;
//上面判断了两个数长度不一样的情况,下面是长度一样的情况
for (int i = 0; i < n; i++) {
if (s1[i] != s2[i])
return s1[i] > s2[i];
}
return true; //这是两个数一样的情况
}
int main() {
int la, lb, lc;
//因为我们要让被减数始终大于减数,所以当被减数小于减数时,我们要交换两个数的位置,最后加上负号。
//比如11 - 65 = -54,我们交换位置后变成65 - 11 = 54,最后在输出前加上负号即可
//这个flag就是判断是否加负号的标志
int flag = 0;
cin >> s1 >> s2;
if (!compare(s1, s2)) {
flag = 1; //如果满足条件,就要交换位置,那么flag的值就要改变
strcpy(s3, s1);
strcpy(s1, s2);
strcpy(s2, s3);
}
cout << la << lb <<endl;
//此处和高精度加法一样,详细解释可以看我的高精度加法
for (int i = 0; i < la; i++) {
a[la - i] = s1[i] - '0';
}
for (int i = 0; i < lb; i++) {
b[lb - i] = s2[i] - '0';
}
lc = max(la, lb);
for (int i = 1; i <= lc; i++) { //算法核心,注意!! i从开始
if (a[i] < b[i]) {
a[i + 1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
//如果两个数相减,例如123 - 111 = 12,lc=3;
//那么在数组c中保存的就是c[0];c[1]=2;c[2]=1;c[3]=0;
//c[lc] == 0 就是c[3]=0 满足条件
//条件 lc > 1 就是保证0 - 0 = 0的情况
while (c[lc] == 0 && lc > 1)
lc--;
if (flag == 1) //如果两个数交换了位置,则先输出负号
printf("-");
for (int i = lc; i > 0; i--) {
printf("%d", c[i]);
}
return 0;
}