我有一些代码:
using namespace std;
std::string decomp(int n) {
vector<int> v;
for (int i = 2; i <= n; i++) v.push_back(i);
auto e = v.end();
for (auto b = v.begin(); b != e; b++) {
for (int j = 2; j <= (*b / 2); j++) {
cout << "j" << j << endl;
cout << "b" << *b << endl;
if (*b % j == 0) {
v.push_back(j);
v.push_back(*b / j);
v.erase(b);
b--;
e = v.end();
break;
}
}
}
string output;
int max_value = *max_element(v.begin(), v.end());
cout << "mv" << max_value << endl;
for (int i = 2; i <= max_value; i++) {
int count_of_this_element = count(v.begin(), v.end(), i);
cout << "o" << count_of_this_element << endl;
if (count_of_this_element == 1) output += to_string(i) + " * ";
else if (count_of_this_element == 0) output += "";
else output += to_string(i) + "^" + to_string(count_of_this_element) + " * ";
}
// output.erase(output.end());
// output.erase(output.end());
// output.erase(output.end());
return output;
}
int main() {
cout << decomp(14) << endl;
return 0;
}
当我运行它时,我得到这样的输出:
j2
b4
j2
b5
j2
b6
j2
b7
j3
b7
j2
b8
j2
b9
j3
b9
j2
b10
j2
b11
j3
b11
j4
b11
j5
b11
j2
b12
j2
b13
j3
b13
j4
b13
j5
b13
j6
b13
j2
b14
j2
b234881038
j2
b39053
j3
b39053
j4
b39053
j5
b39053
j6
b39053
j7
b39053
j2
b9179272
j2
b9179864
j2
b1987727968
j2
b1987727968
j2
b1987727968
j2
b1988456824
j2
b1987728232
j2
b1987729392
j2
b1987729776
j2
b1988458632
我的任务是做一个从1到n的数字向量,然后在for循环中寻找一个非素数。当我找到一些非素数时,我将这个数分解为它的两个整数分量,将它们推回向量并删除分解的数。但是在输出中,您可以看到,当它达到14(最大的数字)时,下一个数字是“234881038”。数字分隔符似乎已写入另一个内存位置。我如何才能得到我推回的数字?
1条答案
按热度按时间bogh5gae1#
这组循环:
三个bug:
e = v.end()
是不必要的,但也有问题。一旦调用了push_back
或erase
,结束位置就发生了变化。只需在for循环中比较b != v.end()
。v.erase(b)
后面跟着b--
充其量是奇怪的,可能是未定义的行为。您刚刚删除了b
,然后代码尝试在其上执行迭代器数学运算。你可以从erase的返回值得到一个更新的迭代器。Ala:b = v.erase(b);
b
迭代器通常也会在您调用v.push_back(j)
时立即无效(被删除)。然后在计算*b/j
时再次崩溃我们可以尝试将一整套修复程序放在一起。但是上面的内容对于你正在尝试做的事情来说仍然太复杂了。
这样来计算所有的素数和非素数:
然后,如果你想把一个给定的非素数分解成它的素因子,你可以这样做: