定义嘛,去看一看高精度加法那一篇。
今天我们再来看看“阔别已久”的高精度##
今天学减法!
话不多说,代码献上##
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
char tmp[MAXN] = {};//交换用字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
int main() {
scanf("%s %s", s1, s2);//读入字符串
int lena = strlen(s1);
int lenb = strlen(s2);
//判断最终的结果符号
if ((lena<lenb) || (lena==lenb && strcmp(s1,s2)<0)) {
//被减数小于减数,结果为负数
printf("-");
//交换数据
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
//更新长度数据
lena = strlen(s1);
lenb = strlen(s2);
}
//将字符串写入到数组A中
for (int i=0; i<lena; i++) {
//倒序写入
a[i] = s1[lena-i-1] - '0';
}
//将字符串写入到数组B中
for (int i=0; i<lenb; i++) {
//倒序写入
b[i] = s2[lenb-i-1] - '0';
}
//模拟竖式减法
for (int i=0; i<lena; i++) {
if (a[i]<b[i]) {
//有借位
a[i+1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
//删除前导零
for (int i=lena-1; i>=0; i--) {
//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0==c[i] && lena>1) {
//注意要有 lena>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
lena--;
} else {
//第一个不是零的最高位,结束删除
break;
}
}
//逆序打印输出
for (int i=lena-1; i>=0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
意思解析里全有,不懂留言问
还是那句话:
三连!