美文网首页
C++实现大数相加

C++实现大数相加

作者: Virtualer | 来源:发表于2019-08-28 00:26 被阅读0次

    大数指采用正常数据类型无法进行计算的数字,本文采用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

    相关文章

      网友评论

          本文标题:C++实现大数相加

          本文链接:https://www.haomeiwen.com/subject/oeduectx.html