【问题标题】:using putchar_unlocked for fast output使用 putchar_unlocked 快速输出
【发布时间】:2013-08-02 00:14:59
【问题描述】:

我希望在我的代码中使用快速输入和输出。我了解getchar_unlocked 使用以下函数进行快速输入。

inline int next_int() {
    int n = 0;
    char c = getchar_unlocked();
    while (!('0' <= c && c <= '9')) {
        c = getchar_unlocked();
    }
    while ('0' <= c && c <= '9') {
        n = n * 10 + c - '0';
        c = getchar_unlocked();
    }
    return n;
}

谁能解释一下如何使用putchar_unlocked() 函数使用快速输出?

我正在通过this question,有人说putchar_unlocked()可以用于快速输出。

【问题讨论】:

  • 你用的是c++还是c?
  • @aaronman 我正在使用 C++
  • 那么不要这样做,因为你可能不需要它
  • @aaronman 我理解我可能面临的问题,但我需要用它来减少我正在练习的代码的时间
  • 那是因为 cin 和 cout 甚至比 scanf printf 和 getchar_unlocked 和 putchar_unlocked 的输入/输出速度更快...我需要做的就是快速运行我的代码...如果它的 c 或c++ 对我来说无关紧要……这就是我需要它的原因……目前我编写的代码是用 c++ 编写的,如果需要的话,我可以将其更改为 c

标签: c++


【解决方案1】:

下面的代码非常适合使用 putchar_unlocked() 进行快速输出。

  #define pc(x) putchar_unlocked(x);
    inline void writeInt (int n)
    {
        int N = n, rev, count = 0;
        rev = N;
        if (N == 0) { pc('0'); pc('\n'); return ;}
        while ((rev % 10) == 0) { count++; rev /= 10;} //obtain the count of the number of 0s
        rev = 0;
        while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}  //store reverse of N in rev
        while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
        while (count--) pc('0');
    }

通常 Printf 用于输出非常快,但是对于写入 Integer 或 Long 输出,下面的函数稍微快一点。
这里我们使用 putchar_unlocked() 方法来输出一个字符,它类似于线程不安全版本putchar() 并且速度更快。

See Link.

【讨论】:

  • 它仅检查数字末尾是否有“0”序列。如果数字中间有“0”序列,则此功能不起作用。例如:12300023
  • @648trindade 它有效。
  • 将以下内容添加到函数的开头,使其适用于负数:if (n &lt; 0) { pc('-'); n *= -1; }
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多