抛出' std :: bad_alloc'的实例后调用C ++终止

时间:2017-12-27 05:23:43

标签: c++ recursion memory-leaks

给定一个整数,我们需要找到整数的超级数字。

我们使用以下规则定义整数x的超级数字:

如果x只有1个数字,则其超级数字为x 否则,超级数字等于x的数字和的超级数字。这里,数字的数字和被定义为其数字的总和。

示例:

super_digit(9875) = super_digit(9+8+7+5) 

= super_digit(29) 

= super_digit(2+9)

= super_digit(11)

= super_digit(1+1)

= super_digit(2)

= 2

任务: 您将获得两个号码nk。您必须计算p的超级数字。当p连接n次时,会创建k

解决此问题的我的代码如下所示。

#include <bits/stdc++.h>
#include <string>
#include <iostream>
#include <math.h>

using namespace std;

int superDigit(string n, int k)
{
    int res=0;
    for (int x = 0; x < n.length(); x++)
    {
        res += n[x] - '0';
    }
    res = k * res;
    if (res < 10)
        return res;
    else
        return superDigit(to_string(res),1);
}

int main() {
    string n;
    int k;
    cin >> n;
    cin >> k;
    cout << superDigit(n, k)<< endl;
    return 0;
}

代码似乎对所有小数字都能正常工作,但在n时 是1e100000-1k100000,程序返回以下错误:

  

在抛出&#39; std :: bad_alloc&#39;

的实例后终止调用      

what():std :: bad_alloc

我认为它是内存泄漏,但我该如何解决这个问题。泄漏在哪里发生?

1 个答案:

答案 0 :(得分:-1)

您将n作为1e10000-1。这大约是1e10000个字符。假设每个字符的字节大小约为1。然后,

  

1e10000 bytes = 1e9997 kilobytes = 1e9994 MB = 1e9994 GB = 1e9991 TB   你可以看到它非常大。