以下代码用于打印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 ;
}
答案 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函数可能比这更好,并且此函数不能处理负数(上面没有发布的那个)。