2013-01-06 80 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函數可能比這更好,並且此函數不能處理負數(上面沒有提到)。