在蛮力任务上抛出bad_alloc

时间:2018-07-11 15:23:05

标签: c++ c++11 bad-alloc

我下面的程序在执行蛮力任务时抛出bad_alloc。我认为这是由我的职能内的某些原因造成的,但我无法找出是什么原因造成的。有人可以帮我找到导致此错误的原因吗?问题语句在下面,然后我的代码在下面。

问题声明 编写一个读取两个数字的程序(以10为基数表示): N(1 <= N <= 15) S(0

代码

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <fstream>

using namespace std;

string convert(int num, int base)
{
    int quo = 100000;
    int rem = 0;
    string to_reverse;
    while (quo > 0)
    {
        quo = num / base;
        rem = num % base;
        to_reverse += to_string(rem);
        num /= base;
    }
    reverse(to_reverse.begin(), to_reverse.end());
    return to_reverse;
}

bool is_pal(string conv_num)
{
    string reversed_conv_num = conv_num;
    reverse(reversed_conv_num.begin(), reversed_conv_num.end());
    if (reversed_conv_num == conv_num)
    {
        return true;
    }

    return false;
}

int main()
{
    ofstream fout("dualpal.out");
    ifstream fin("dualpal.in");
    int n, start;
    cin >> n >> start;
    vector<int> finals;
    int times = 0;
    for (int i = start + 1; i <= 10000; i++)
    {
        if (times == n)
        {
            for (auto x : finals)
            {
                cout << x << "\n";
            }
            break;
        }
        else
        {
            for (int j = 2; j <= 10; j++)
            {
                if(is_pal(convert(i, j)) == true)
                {
                    times++;
                    finals.push_back(i);
                }
            }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是以下行:

while (quo >= 0)

如果x/yx < y的结果是什么?特别是0/x的结果是什么?猜猜,结果始终为0,因此您条件中的==部分将始终为true,从而导致无休止的循环一次又一次地添加'0',直到没有剩余的内存为止。所以只需检查一下代替> 0

旁注:无论如何,您都不需要quo变量:

while(num)
{
    int rem = num % base;

    // OK, this won't do the trick; you try to append an integer,
    // but need a character instead!
    //to_reverse += rem;

    // if base always is smaller than or equal to 10 anyway,
    // you can just do:
    to_reverse += char('0' + rem);

    // if you want to support arbitrary bases even greater, you can do instead:
    to_reverse += "0123456789abcdefghijklmnopqrstuvwxyz"[rem];
    // (or capital letters, if you prefer)

    num /= base;
}
// and now don't reverse here - you are just interested in if the
// string is palindrome, not in correct number representation...

顺便说一句:可以更有效地进行回文检查(避免复制):

if(!s.empty())
{
    auto l = s.begin();
    auto r = std::prev(s.end());
    while(l < r)
    {
        if(*l != *r)
        {
            return false;
        }
        ++l;
        --r;
    }
}
return true;

针对以下问题进行编辑:

  

我将其更改为quo> 0而不是quo> = 0,您知道为什么我的程序会输出大量的整数吗?

for (int j = n + 1; j <= 10000; j++)
    for (int i = 0; i < n; i++)
        for (int k = 2; k <= 10; k++)

您已经创建了许多迭代:(10000-n)* n * 9,并且您可能会从...获得很多回文。

您可能想要这样的东西:

while(n && start < 10000)
{
    for(int base = 2; base <= 10; ++base)
    {
        if(palindrome(start, base))
        {
            --n;
        }
    }
    ++start;
}

好吧,上面的方法并不精确,您可以从内部循环中获得比所需更多的值,让您自己修复...