我的代码是:
0
此代码显示m和n的较大输入的运行时错误,因为数组大小仅为10 ^ 5长。当我制作10 ^ 10的数组时,出现了编译错误,并且显示这个更大的数组是不可能的。
答案 0 :(得分:1)
如果您打算使用Sieve Of Eratosthenes,请计算从0到10 ^ 5的所有素数。这是基于以下事实:所有复合数必须至少有1个素因子小于或等于其平方根。
一旦计算了所有素数,就存储所有质数(我建议使用向量)。然后在循环遍历n
到m
的数字时,使用保存的素数来测试素数。
以下筛选功能应该可以完成这项工作:
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;