2013-01-06 40 views
0

以下代码用于打印int。我如何修改它以打印long long int?请解释。通过快速I/O打印long long

对于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 ; 
} 
+0

pc:putchar_unlocked – user1543957

回答

6

没有什么具体的关于代码INT。只需将“int”替换为“long long int”,就完成了。 (我发现* 10的“优化”是通过移位来实现的,并且增加了所有剩余分支的相当可笑,任何体面的C编译器都会自动完成这些操作(还有更多),并且不要忘记将这个“快速“的版本反对stdlib例程,以确保它真的值得努力)。

+0

该modulo也不便宜。我会使用展开的循环:'if((rev%100000000)== 0){count + = 8; rev/= 100000000; } if((rev%10000)== 0){count + = 4; rev/= 10000; }//等'但天真地做,这将引入一个大小的假设。 – MSalters

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函数可能比这更好,并且此函数不能处理负数(上面没有提到)。