【发布时间】:2020-11-23 08:44:27
【问题描述】:
我在 Hackerrank 中解决了一个问题,问题是找到一个范围内的素数计数。由于使用常规方法面临超时,我使用了埃拉托色尼筛。除了两个隐藏的测试用例外,大多数测试用例都有效。我在 GDB 编译器中运行代码,发现代码只支持高达 600 万的值。我该怎么办?代码如下:
#include<cstring>
#include<cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
void SieveOfEratosthenes(unsigned long long int a,unsigned long long int b)
{
unsigned long long int count=0;
bool prime[b+1];
memset(prime, true, sizeof(prime));
for (unsigned long long int p=2; p*p<=b; p++)
{
// If prime[p] is not changed, then it is a prime
if (prime[p] == true)
{
for (unsigned long long int i=p*p; i<=b; i += p)
prime[i] = false;
}
}
for (unsigned long long int p=a; p<b; p++)
if (prime[p] &&p!=1)
count++;
cout<<count;
}
int main()
{
unsigned long long int a,b;
cin>>a>>b;
SieveOfEratosthenes(a,b);
return 0;
}
【问题讨论】:
-
对于大于 600 万的数字,什么会失败?
-
也许不是的问题,但
bool prime[b+1];不是标准的c++。 Why aren't variable-length arrays part of the C++ standard? -
可能是函数栈溢出了,可以用vector代替bool数组
bool prime[b+1]; -
一个大小为 600 万的布尔数组(每个大小为 1 个字节)大约是 6Mb 的堆栈大小。你几乎肯定超过了堆栈限制。
-
我想问一件事:您是否必须回答包含
a和b的多个查询?
标签: c++ primes memset sieve-of-eratosthenes largenumber