C++实现大数相加

2019-08-28  本文已影响0人  Virtualer

大数指采用正常数据类型无法进行计算的数字,本文采用string类型存储和计算。

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

//  通过下标实现
string BigDataAdd(string str1, string str2) {
    int temp = 0; // 相加之和的个位
    int cp = 0; // 进位
    string strRet; // 相加结果的字符串

    int lenlong = str1.length() > str2.length() ? str1.length() - 1 : str2.length() - 1;
    int lenshort = str1.length() > str2.length() ? str2.length() - 1 : str1.length() - 1;
    string strlong = str1.length() > str2.length() ? str1 : str2;
    string strshort = str1.length() > str2.length() ? str2 : str1;
    while (lenlong >= 0) {
        if (lenshort >= 0) {
            temp = ((strlong[lenlong] - '0') + (strshort[lenshort] - '0') + cp) % 10;
            cp = ((strlong[lenlong] - '0') + (strshort[lenshort] - '0') + cp) / 10;
            --lenlong;
            --lenshort;
        } else {
            temp = ((strlong[lenlong] - '0') + cp) % 10;
            cp = ((strlong[lenlong] - '0') + cp) / 10;
            --lenlong;
        }
        strRet = to_string(temp) + strRet;
    }
    strRet = cp > 0 ? to_string(cp) + strRet : strRet; //记得加上最后一个进位的值

    return strRet;
}

//  通过迭代器实现
string BigDataAdd(string str1, string str2)
{
    string str;
    int cp = 0;
    int temp = 0;
    auto p = str1.length() > str2.length() ? str1.rbegin() : str2.rbegin();
    auto q = str1.length() > str2.length() ? str1.rend() : str2.rend();
    auto m = str1.length() > str2.length() ? str2.rbegin() : str1.rbegin();
    auto n = str1.length() > str2.length() ? str2.rend() : str1.rend();
    while(p != q)
    {
        if (m != n)
        {
            temp = ((*p - '0') + (*m - '0') + cp) % 10;
            cp = ((*p - '0') + (*m - '0') + cp) / 10;
            ++p;
            ++m;
        }
        else
        {
            temp = ((*p - '0') + cp) % 10;
            cp = ((*p - '0') + cp) / 10;
            ++p;
        }
        str += to_string(temp);
    }
    reverse(str.begin(), str.end());
    return str;
}

int main(int argc, char **argv) {
    string str1, str2;
    cout << "str1 : ";
    cin >> str1;
    cout << "str2 : ";
    cin >> str2;
    string strAddRet = BigDataAdd(str1, str2);
    cout << "add ret : " << strAddRet.c_str() << endl;
    return 0;
}

同样也可以用vector来做,效果是一样的。不过需要使用函数string_to_array将输入的大数字符串转换为vector

上一篇下一篇

猜你喜欢

热点阅读