【问题标题】:Different answer using fast I/O C++使用快速 I/O C++ 的不同答案
【发布时间】: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&lt;iostream&gt; 操作混合在一起?选择其中之一,而不是两者都选。另外,ll 是什么?它是从“竞争性编程”网站复制的那些疯狂的宏之一吗?如果是这样,则无需在 C++ 中进行这种混淆,因为现在可以使用 int64_t
  • for(int j = i*i; j &lt; maxx; j+=2*i)也是错误的,i*i很容易超出int的限制。
  • 我不明白混合原始数组和 STL 容器的目的,您可以在使用 c 样式数组的任何地方使用向量。例如你可以写vector&lt;int&gt; arr(100000000, 0)
  • @foragerDev 如果数组是全局的,则不涉及栈,另外数组会自动初始化为0。

标签: c++ printf c++14 sieve


【解决方案1】:

"ios_base::sync_with_stdio(false); cin.tie(NULL);" 仅在有多个测试用例时才使输出更快。 而且我猜你在这里也没有接受任何输入。所以使用 cin.tie(NULL) 可能不是最好的主意。

【讨论】:

  • 您的回答似乎没有解决问题。他的问题是,当他使用这些代码行时,为什么他的答案是错误的?
猜你喜欢
  • 2021-08-17
  • 2017-09-20
  • 2010-10-16
  • 2012-08-08
  • 2015-05-24
  • 2016-08-12
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多