为啥即使 Eratothenes 筛子的时间复杂度为 O(nlog(log(n))),程序对于 n=100000 也不起作用
Posted
技术标签:
【中文标题】为啥即使 Eratothenes 筛子的时间复杂度为 O(nlog(log(n))),程序对于 n=100000 也不起作用【英文标题】:Why program is not working for n=100000 even if time complexity of sieve of eratothenes is O(nlog(log(n)))为什么即使 Eratothenes 筛子的时间复杂度为 O(nlog(log(n))),程序对于 n=100000 也不起作用 【发布时间】:2021-06-22 11:01:27 【问题描述】:#include<bits/stdc++.h>
using namespace std;
int main()
int n;
cout<<"enter the no till which prime nos to be found :"<<endl;
cin>>n;
vector<int> prime(n+1,0);// we want n index too
for(int i=2;i<=n;i++)
if(prime[i]==0)
for(int j=i*i;j<=n;j=j+i)
prime[j]=1;
cout<<"prime numbers are: "<<endl;
for(int i=2;i<=n;i++)
if(prime[i]==0)
cout<<i<<endl;
return 0;
上面的代码应该适用于 n>=100000,因为 n(log(log(n))) 将等于 400000。
【问题讨论】:
请不要添加填充文本以绕过质量过滤器。相反,请准确描述问题所在:“不工作”是什么意思? 用更专业的术语解释“不工作”。 你知道如何判断i
的哪些值会导致int j = i * i
溢出吗?你知道当i * i
溢出时j
会有什么值吗?
【参考方案1】:
当n
大于大约 46000 时,您的 i*i
会溢出 32 位 int
。这会导致未定义的行为。在我的系统上,它环绕并用负值初始化j
,导致访问prime[j]
时出现分段错误。
这与时间复杂度无关。
【讨论】:
以上是关于为啥即使 Eratothenes 筛子的时间复杂度为 O(nlog(log(n))),程序对于 n=100000 也不起作用的主要内容,如果未能解决你的问题,请参考以下文章