问题:给定偶数(大于2),返回两个素数,其总和将等于给定数。 解决方案:使用eratosthenes筛子找到所有数量的素数。然后找到总和等于给定数字的数字对。 代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
void primesum(int A)
{
std::vector<bool> primes(A + 1, 1);
std::vector<int> arr, final;
primes[0] = 0;
primes[1] = 0;
for (int i = 2; i <= int(sqrt(A)); i++)
{
if (primes[i] == 1)
{
for (int j = 2; i + j <= A; j++)
{
primes[i * j] = 0;
}
}
}
for (int i = 0; i < primes.size(); i++)
if (primes[i])
arr.push_back(i);
/* for (auto x : primes)
std::cout << x << " ";
std::cout << "\n"; */
std::vector<int>::iterator it;
for (int i = 0; i < arr.size(); i++)
{
it = std::find(arr.begin(), arr.end(), A - arr[i]);
if (it != arr.end())
{
final.push_back(arr[i]);
final.push_back(A - arr[i]);
break;
}
}
std::cout << final[0] << " " << final[1] << "\n";
return;
}
int main()
{
int x = 184;
primesum(x);
return 0;
}
此代码适用于大多数情况,例如x = 184时的情况除外。这种情况的错误是:
a.out: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
[1] 13944 abort (core dumped) ./a.out
我无法理解为什么会这样,以及它的解决方案是什么?
答案 0 :(得分:2)
让x=184
。然后primes.size()
是185.第一个循环迭代到i=13
。 13是素数。第二个循环迭代到j=171
。在循环中,您可以访问primes[2223]
。这是一个写出界限,导致UB。结果会导致动态内存和断言损坏。
看起来你在循环条件中输错了,你想要i * j <= A
。
答案 1 :(得分:0)
使用primes[i * j] = 0
,您在找到素数时会有无效的索引超过矢量大小,这就是此代码崩溃的原因。您可以将其更正为
for (int i = 2; i <= int(sqrt(A)); i++)
{
if (primes[i] == 1)
{
for (int j = 2; i * j <= A; j++)
{
primes[i * j] = 0;
}
}
}