我下面的程序在执行蛮力任务时抛出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;
}
答案 0 :(得分:0)
问题是以下行:
while (quo >= 0)
如果x/y
,x < 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;
}
好吧,上面的方法并不精确,您可以从内部循环中获得比所需更多的值,让您自己修复...