C++ 如何增加数组的大小,以从1(101201301..等等)开始,以100的增量适应所有素数?
逻辑是错误的。与其使用大量布尔数组来标记该范围内的所有数字(只要尝试非常大的范围,就会耗尽内存),只需使用一个包含足够元素的整数数组,以满足预期的素数数量,并将生成的整数存储在其中C++ 如何增加数组的大小,以从1(101201301..等等)开始,以100的增量适应所有素数?,c++,arrays,primes,sieve,C++,Arrays,Primes,Sieve,逻辑是错误的。与其使用大量布尔数组来标记该范围内的所有数字(只要尝试非常大的范围,就会耗尽内存),只需使用一个包含足够元素的整数数组,以满足预期的素数数量,并将生成的整数存储在其中 最好使用向量,例如std::vector。如果您没有使用c++11+,您可能会考虑使用malloc和realloc来获取、保留和调整结果列表的大小。您是否尝试使用std::vector来节省内存并避免使用堆栈?请注意,VLA不是标准的C++@g_bor Unsigned long long,这不会影响数组中实际值的限
最好使用向量,例如
std::vector
。如果您没有使用c++11+,您可能会考虑使用malloc
和realloc
来获取、保留和调整结果列表的大小。您是否尝试使用std::vector
来节省内存并避免使用堆栈?请注意,VLA不是标准的C++@g_bor Unsigned long long,这不会影响数组中实际值的限制,而不会影响数组中存储的数据量吗?请注意memset(prime,true,sizeof(prime))代码>不使用true
填充数组。如果一个bool
的大小是四(这是常见的),它将被4369填充。使用<代码> STD::填写< /Calp>。<代码>布尔Orth[n+1] < /Cord>不是C++。即使是这样,你也会把你的堆栈炸掉。这并不能解决这个问题,但是如果(prime[p]==true)
是多余的if(prime[p])
也这么说。
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes(int n)
{
bool prime[n+1];
memset(prime, true, sizeof(prime));
for (int p=2; p*p<=n; p++)
{
if (prime[p] == true)
{
for (int i=p*p; i<=n; i += p)
prime[i] = false;
}
}
int index = 0;
for (int p=2; p<=n; p++)
if (prime[p])
{
index += 1;
if(index % 100 == 1)
{
cout << index << ". " << p << endl;
}
}
}
int main()
{
SieveOfEratosthenes(1000000); //if i add another 0 on this function the code won't run
return 0;
}
1. 2
101. 547
201. 1229
301. 1993
401. 2749
501. 3581
601. 4421
701. 5281
801. 6143
901. 7001
1001. 7927
1101. 8837
1201. 9739
1301. 10663
1401. 11677
//..... (and so on until,)
78301. 997219
78401. 998617 // it stops here