主要内容 #
- 进位错位的处理
- 高精度减法
1. 进位,错位处理 #
高精度减法,也是竖式减法。

从个位起逐位相减,遇到负的情况则向上一位借 。整体思路与加法完全一致。
下面例程中的 a b c 均为整形数组。
- 减法借位:
#include <iostream>
#include <string>
using namespace std;
void jianfa(int a[], int a_len, int b[], int b_len, int* result, int& result_len)
{
int i = 0, x = 0;
result_len = 0;
//存储两数中的较大位数到max_a_b中
int max_a_b = a_len > b_len ? a_len : b_len;
while (i < max_a_b)
{
int sub_a = i < a_len ? a[i] : 0;
int sub_b = i < b_len ? b[i] : 0;
// 减法
if (sub_a < sub_b)
{
--a[i + 1];
sub_a += 10;
}
result[i] = sub_a - sub_b;
result_len++;
i++;
}
// 假如结果全都是0,输出一个0
int sum(0);
for (int i = 0; i < result_len; ++i)
{
sum += result[i];
if (sum != 0)
break;
}
if (sum == 0)
result_len = 1;
}
int main()
{
//输入的数字以字符串的形式存储
string astr, bstr, temp;
cin >> astr;
cin >> bstr;
//获取两个字符串的长度即两个数字的位数
int isSmaller = 0; //第一个数是否比第二个数大
int lena = astr.size(), lenb = bstr.size();
if(lenb > lena){
isSmaller = 1;
}
if(lena == lenb){
for(int i = 0; i < lena; i++){
if(astr[i] < bstr[i]){
isSmaller = 1;
break;
}
}
}
//astr中存储较大的数组
//记得交换a b数组的长度!
if(isSmaller){
swap(astr, bstr);
swap(lena, lenb);
}
int a[100], b[100];
for (int i = 0; i< astr.size(); ++i)
a[lena - i - 1] = astr[i] - '0'; // 将字符串的数字
for (int i = 0; i< bstr.size(); ++i)
b[lenb - i - 1] = bstr[i] - '0';//将字符转化为数字
int c[100] = { 0 }, lenc = 0;
jianfa(a, lena, b, lenb, c, lenc); // 必须是两个非负数
//找到不是零的第一位数字
int not_zeors = lenc - 1;
while(c[not_zeors] == 0){
if(not_zeors == 0){
break;
}
not_zeors--;
}
//小数减大数,要加上负号
if(isSmaller){
cout << "-";
}
for(int i = not_zeors; i >= 0; i--){
cout << c[i];
}
cout << endl;
return 0;
}
2. 高精度减法 #
请输入两个数,计算它们的差。
【算法分析】
竖式方法举例:
- 大数减小数:189 – 159
- 小数减大数:159 – 189
【例程】
习题 #
请将上面的例题,独立完成一遍。要求必须掌握。下节课要求每个人都能够独立写出上面的代码。
课后练习
