C++ 高精度减法运算(a=a-b)

一、题目

      求两个大的正整数相减的差。

 

二、思路

     1.接收输入的两个大整数的数字串:

        用string接收两个正整数的数字串(C用字符数组或字符指针);

     2.比较两个正整数哪个大?

       (1)比较两个大整数的数字串长度;

       (2)如果长度相等,可用strcmp函数比较两个数字串,头文件为:#include <cstring>;

               如果是第一个数大于或等于第二个数,那差是非负整数;否则为负数,负数要输出符号“-”,同时交换两个

        数字串:让较大的数字串是第一个数,较小的为第二个数

     3.将两个大整数的数字串分别存放在整型数组a和b中:从低位往高位存放

        a存放较大的数,b存放较小的数

     4.然后,从低位往高位进行相减,不够的从高位借位;

        a = a - b;

     5.最后输出结果。

 

三、实现程序

#include <iostream>
#include <string>
using namespace std;

const int MAX = 5000;
typedef int Arr[MAX]; // 使用别名
bool isLarge(string str1, string str2, int la, int lb); // 比较两个数字串的大小
void toMinus(Arr a, Arr b, int &la, int lb); // 将两个高精度数相减 a = a - b

int main(int argc, const char * argv[]) {
    string str1, str2, temp;
    int la, lb, i, tempab; // 存储数字串的长度
    Arr a, b;
    
    cout << "请输入两个大整数(用空格隔开):" << endl;
    while(cin >> str1 >> str2) {
        la = (int)str1.size(); // 获取字符串的长度
        lb = (int)str2.size();
        
        // 比较两个数字串的大小
        // (1)比较长度:短的就小,长的大;
        // (2)长度相等,就比较高位第一位,小的就小,大的就大,相等则
        //    比较低一位,重复类似。
        // 逆置数字串:根据数字与ASCII码的关系
        //          把数字从低位到高位存到整数数组中
        // 也可以用比较大小函数strcmp进行比较,头文件为:#include <cstring>
        // 这里我为了让初学者明白原理,所以自己写了比较函数
        cout << "这两个整数之差为:" << endl;
        // 调用自定义比较函数:比较两个数字串的大小
        bool isFlag = isLarge(str1, str2, la, lb);
        if(isFlag) { // 第一个高精度数大于第二个,交换
            // 交换数字串a,b
            temp = str1;
            str1 = str2;
            str2 = temp;
            
            // 交换数字串长度
            tempab = la;
            la = lb;
            lb = tempab;
            
            cout << "-"; // 负数要输出符号"-"
        }
        
        // 清零
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        for(i = 0; i < la; i++) {
            a[la-i-1] = str1[i] - '0';
        }
        for(i = 0; i < lb; i++) {
            b[lb-i-1] = str2[i] - '0';
        }
        
        toMinus(a, b, la, lb); // 调用求差函数
        for(i = 0; i < la; i++)
            cout << a[la - i - 1];
        cout << endl;
    }
    return 0;
}

// 比较两个数字串的大小,如果第一个数小于第二个数,就返回true并交换两个数字串。
bool isLarge(string str1, string str2, int la, int lb) {
    if(la < lb) // 长度小于第二个,第二个数大
        return true;
    else if(la == lb) {
        // 从高位开始比较,直到不同;
        while(str1[la-1] == str2[lb-1]) {
            la--;
            lb--;
        }
        if(str1[la-1] < str2[lb-1]) // 如果第一个小于第二个,返回真
            return true;
    }
    return false;
}

// 将两个高精度数相减 a = a - b; 返回la的长度
void toMinus(Arr a, Arr b, int &la, int lb) {
    int i;
    
    for(i = 0; i < la; i++) { // 逐位相减
        if(a[i] < b[i]) { // 不够减则要借位
            a[i+1]--;
            a[i] = a[i] + 10;
        }
        a[i] = a[i] - b[i]; // 计算出差的第i位
    }
    while(la > 1 && a[la-1] == 0) // 从高位往低位走,直到不为0
        la--;
}

测试结果:


版权声明:本文为chuanzhouxiao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。