跳至正文
View Categories

1 min read

主要内容 #

  1. 进位错位的处理
  2. 高精度减法

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

【例程】


习题 #

请将上面的例题,独立完成一遍。要求必须掌握。下节课要求每个人都能够独立写出上面的代码。
课后练习