使用eratosthenes筛在m和n相当大的10 ^ 10范围内打印m和n之间的素数

时间:2016-09-09 02:30:44

标签: c++ algorithm

我的代码是:

0

此代码显示m和n的较大输入的运行时错误,因为数组大小仅为10 ^ 5长。当我制作10 ^ 10的数组时,出现了编译错误,并且显示这个更大的数组是不可能的。

3 个答案:

答案 0 :(得分:1)

如果您打算使用Sieve Of Eratosthenes,请计算从0到10 ^ 5的所有素数。这是基于以下事实:所有复合数必须至少有1个素因子小于或等于其平方根。

一旦计算了所有素数,就存储所有质数(我建议使用向量)。然后在循环遍历nm的数字时,使用保存的素数来测试素数。

以下筛选功能应该可以完成这项工作:

bitset<100005> bs;
vector<long long> primes;
void sieve(){
    bs.set();
    bs[0] = bs[1] = 0;
    for (long long i = 2; i <= 100000; ++i){
        if (bs[i]){
            primes.push_back(i);
            for (long long j = i*i; j <= 100000; j += i) bs[j] = 0;
        }
    }
 }

答案 1 :(得分:0)

没有必要使用long long数组,bitset会这样做。使用全局变量而不是本地变量可以解决运行时错误。

bitset<s> arr;

但是,如果您要使用eratosthenes筛选数字那么大,可能需要很长时间才能得到正确的答案,因此它将获得在线评委的TLE。

答案 2 :(得分:0)

首先不要使用long long但是bitset或char(也可以在C中移植,这种程序的推荐语言)。它只需要存储一个布尔标志。插槽保持的数字由start_value + index给出。 第二个for循环,应该使用step current_prime移动。 i + = 2,i + = 3,i + = 5,依此类推。 伪代码将是:

first_prime_array="compute the prime number until sqrt(n)"
while(first_prime_array contains prime number)
{
   start=seek first position in main_array divisible by  current_prime
   for (i=start;i<n;i+=current_prime)
       main_array[i]=1;

}
print all the values ==0 hold in main_array as m+index;