我试图找到第n个方形自由半素数。(N <= 2 * 10 ^ 6)。我有以下代码尝试这样做。我一直在这里遇到运行时错误,我无法弄清楚原因。
这就是我所做的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 3000000
int main()
{
bool* prime = new bool[N];
int* primes = new int[N];
int* semiprimes = new int[2000005];
for(int i=0; i < N ; i++) prime[i] = true;
int cnt = 0;
for(int i=2 ; i < N ; i++)
{
if(prime[i])
{
primes[cnt++] = i;
for(int j = i; j < N ; j+= i)
prime[j] = false;
}
}
int i, j, k = 1;
int p, q, current_limit;
int target = 2000000;
for (i = 0, p = primes[i]; p < target; i++)
{
current_limit = target/p;
for (j = i + 1, q = primes[j]; q <= current_limit; j++)
{
k++;
semiprimes[k++] = p*q;
}
}
printf("%d\n",k);
int t;
scanf("%d",&t);
int n;
while(t--)
{
scanf("%d",&n);
printf("%d\n",semiprimes[n]);
}
delete[] prime;
delete[] semiprimes;
delete[] primes;
return 0;
}
有人可以告诉我我做错了什么。
答案 0 :(得分:0)
您正在尝试分配堆栈中包含数百万个元素的多个数组,这通常限制在少数几兆字节。你应该在堆上分配,使用类似的东西:
bool *prime = new bool[N];
int *primes = new int[N];
int *semiprimes = new semiprimes[2000005];
// Do everything you need...
delete[] prime;
delete[] primes;
delete[] semiprimes;
答案 1 :(得分:0)
您可能不希望在k
中加倍:
for (j = i + 1, q = primes[j]; q <= current_limit; j++)
{
k++;
semiprimes[k++] = p*q;
}
这意味着只使用数组的每个其他元素。您可能还应检查数组边界(k
等值)是否超出限制。