通过快速i/o打印很长时间

use*_*957 0 c c++

以下代码用于打印int.如何修改它来打印long long int?请解释.

对于pc,阅读putchar_unlocked

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;}
    rev = 0;
    while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
    while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
    while (count--) pc('0');
    pc('\n');
    return ;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 6

代码中没有关于int的具体内容.只需用"long long int"替换两次出现的"int",就可以了.

(我觉得通过移*10"优化",并添加挺可笑的一切仍然存在.什么像样的C编译器会自动做到这一点(和更多).不要忘了分析对这种"快"版本的分裂stdlib例程,确保它确实值得付出努力).


Mat*_*son 5

这段代码比它需要的更复杂:

inline void writeLongLong (long long n)
{
    char buffer[sizeof(n) * 8 * 3 / 10 + 3];  // 3 digits per 10 bits + two extra and space for terminating zero. 
    int index = sizeof(buffer)-1;
    int end = index;
    buffer[index--] = 0;
    do {
       buffer[index--] = (n % 10) + '0';
       n /= 10;
    } while(n);
    puts(&buffer[index+1]);
}
Run Code Online (Sandbox Code Playgroud)

这样做的工作相同,分割/模运算的数量只有一半,至少我可以更好地遵循它.请注意,stdio/stdlib函数可能比这更好,并且此函数不能处理负数(上面没有发布的那个).