【问题标题】:Biginteger Addition in C++C++ 中的大整数加法
【发布时间】:2015-08-08 10:53:31
【问题描述】:

我正在尝试添加两个大整数。这是我制作的一个功能。 s1 是其中较大的字符串。在传递函数参数期间,我将考虑字符串长度。该代码适用于所有值,但具有 10^(n) 的值除外。因此,对于 100 + 2,它显示 o/p 为 2。对于 10 的其他幂情况也是如此。当我进行一些挖掘时,我注意到 for 循环在这些情况下只运行一次。因此s1.length() 报告长度为 1。我该如何解决?

void addBigInteger (string s1,string s2) {
    string str3;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    int temp = 0,carry=0,i;
    for (i=0;i<s1.length();i++) {

        if ((i+1) > s2.length())
            s2[i] = '0';

        temp = s1[i]-'0'+s2[i]-'0'+carry;
        str3[i] = temp%10 + '0';
        carry = temp/10;
    }
    while (carry!=0) {
        str3[i++] = carry%10 + '0';
        carry = carry/10;
    }

    for (i;i>=0;i--) {
        cout << str3[i];
    }
    cout << endl;
}

【问题讨论】:

  • if ((i+1) &gt; s2.length()) s2[i] = '0'; 显然写越界了。
  • 所有对str3的写入也是如此。
  • @timrau 这就是这里的想法。如果说 s2 的长度是 2,s1 的长度是 5,那么 s2 的所有其他数字都将被设为“0”以进行加法。但是,既然您已经说过了,我会看看我是否仍然可以在界限内添加。感谢您指出。编辑:简单地评论那部分是行不通的。猜猜我必须做一些边界检查
  • 使用像 GMPlib 这样的 bignum 库。
  • @g33kyaditya 奇怪的是为什么你把一切都颠倒过来,最后却没有“反转”你的答案。

标签: c++ string-length


【解决方案1】:

您需要使用str2.push_back('0') 来追加字符,而不是使用超出范围的i 分配str2[i]std::string::operator[] 不会“增长”字符串中的内部存储。

【讨论】:

  • 对于如下输入的输出仍然相同:s1 = 100 s2 = 2 str3 = 2
  • @g33kyaditya This 工作正常,没有 valgrind 错误。你最新的代码是什么样子的?
  • 好的。我得到了它。最后一个问题,我什么时候使用 push_back 代替 [...] ?因为据我了解,除了 push_back 附加到末尾之外,它们是相同的。
  • @g33kyaditya 请记住:永远不要使用operator[] 使字符串变长。
  • 如果索引超出范围,您不能使用operator [ ]。与数组没有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多