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

一、为什么要高精度计算

         利用计算机进行数值计算,有时计算要求精度高,希望计算的数的位数达到上百或者上千,甚至更多。但是由于计算机硬件问题,往往达不到实际问题所要求的精度。

 

二、思路:

    1.考虑如何接收输入的大整数

       用string(字符串)操作

    2.如何存储大整数

       (1)用整型数组,每个单元存储一个数位的数字。

       (2)因为考虑到进位和借位的问题,所以存进数组中的数字,须是从低位往高位存储,根据数字和ASCII之间的关系,

       逆转数字串

    3.进行加法运算(先不考虑负整数相加)

       数组a和数组b存储两个加数,从低位开始相加,相加大于10的,用求余%,并向高位进位。

 

三、实现程序:

//  实现:a = a + b; a,b均为高精度数
//       采用整数数组存放
//  测试数据:33333333333333333333 55555555555555555555
//          9876543210 876543210
#include 
#include 
using namespace std; // 使用using编译指令

const int MAX = 5000;
// 将两个高精度数相加: a = a + b;
int toPlus(int a[], int b[], int la, int lb);

int main(int argc, const char * argv[]) {
    string str1, str2;
    int la, lb, i; // 存储数字串的长度
    int a[MAX], b[MAX]; // 数组a, b存储两个加数
    
    cout << "请输入两个大整数(用空格隔开):" << endl;
    while(cin >> str1 >> str2) {
        la = (int)str1.size(); // 获取字符串的长度
        lb = (int)str2.size();
    
        memset(a, 0, sizeof(a)); // 置为零
        memset(b, 0, sizeof(b));
        // 逆置数字串:根据数字与ASCII码的关系
        //          把数字从低位到高位存到整数数组中
        for(i = 0; i < la; i++)
            a[la-i-1] = str1[i] - '0'; // 也可以写成str1[i] - 48
        for(i = 0; i < lb; i++)
            b[lb-i-1] = str2[i] - '0';
    
        la = toPlus(a, b, la, lb); // 调用求和函数
        // 输出求得的和,从高位往低位输出
        for(i = 0; i < la; i++)
            cout << a[la - i - 1];
        cout << endl;
    }
    return 0;
}

// 将两个高精度数相加 a = a + b;
int toPlus(int a[], int b[], int la, int lb) {
    int i, len;
    
    if(la > lb) // 取两个大整数数位较多的一个
        len = la;
    else
        len = lb;
    for(i = 0; i < len; i++) { // 逐位相加
        a[i] = a[i] + b[i];
        a[i+1] = a[i+1] + a[i] / 10; // a[i]/10是第i位向第i+1位的进位
        a[i] = a[i] % 10;
        // 或者用if语句进行判断
        //        if(a[i] >= 10) {
        //            a[i+1]++;
        //            a[i] = a[i] % 10;
        //        }
    }
    if(a[len] != 0) // 最高位有进位
        len++;
    return len; // 返回得到的和的长度
}

测试结果:

C++ 高精度加法运算(a=a+b)_第1张图片

你可能感兴趣的:(数据结构)