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

时间:2013-01-06 23:44:01

标签: 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 ;
}

2 个答案:

答案 0 :(得分:6)

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

(我通过shift找到了* 10的“优化”,并且对所有剩下的部分添加了非常荒谬。任何体面的C编译器都会自动执行此操作(以及更多)。并且不要忘记“快速” “针对stdlib例程的版本,确保它真的值得付出努力。”

答案 1 :(得分: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]);
}

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