以下代码用于打印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)
代码中没有关于int的具体内容.只需用"long long int"替换两次出现的"int",就可以了.
(我觉得通过移*10"优化",并添加挺可笑的一切仍然存在.什么像样的C编译器会自动做到这一点(和更多).不要忘了分析对这种"快"版本的分裂stdlib例程,确保它确实值得付出努力).
这段代码比它需要的更复杂:
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函数可能比这更好,并且此函数不能处理负数(上面没有发布的那个).