【发布时间】:2021-08-22 10:22:34
【问题描述】:
所以我一直在尝试编写生成第 1、第 101、第 201 个素数直到 10^8 的程序。我使用了 ios_base 并因此改变了输出,
vector<int> primes;
int maxx = 100000000;
int arr[100000000];
void sieve(){
arr[0] = 1;
arr[1] = 1;
arr[2] = 0;
primes.push_back(2);
for(int i = 3;i < maxx; i+=2){
if(arr[i]==0){
primes.push_back(i);
if(i*(ll)i < (ll)maxx){
for(int j = i*i; j < maxx; j+=2*i){
arr[j] = 1;
}
}
}
}
}
int main()
{
sieve();
int i = 0, s= primes.size();
while(i < s) {
printf("%d\n", prime[i]);
i += 100;
}
return 0;
}
这给出了正确的答案并且解决方案被接受,但是如果我添加
ios_base::sync_with_stdio(false);
cin.tie(NULL);
生成的行不多,答案是错误的。 为什么会这样?我到处搜索,但人们只说它使程序更快,仅此而已。
【问题讨论】:
-
请提供不正确的输出。
-
为什么将
printf与<iostream>操作混合在一起?选择其中之一,而不是两者都选。另外,ll是什么?它是从“竞争性编程”网站复制的那些疯狂的宏之一吗?如果是这样,则无需在 C++ 中进行这种混淆,因为现在可以使用int64_t。 -
这
for(int j = i*i; j < maxx; j+=2*i)也是错误的,i*i很容易超出int的限制。 -
我不明白混合原始数组和 STL 容器的目的,您可以在使用 c 样式数组的任何地方使用向量。例如你可以写
vector<int> arr(100000000, 0)。 -
@foragerDev 如果数组是全局的,则不涉及栈,另外数组会自动初始化为0。