我正在处理 InterviewStreet 问题 https://www.interviewstreet.com/challenges/dashboard/#problem/4fcf919f11817 ,算法是正确的,但我仍然得到了几个错误的答案,几个小时后我发现问题与打印功能有关:
void printHalf(int64_t x) {
if (x % 2 == 0)
printf("%lld\n", x / 2L);
else
printf("%lld.5\n", x / 2L);
}
此函数接受一个 64 位整数,并打印它的一半。如果我将此函数更改为以下代码,我的解决方案适用于所有测试用例:
void printHalf(int64_t x) {
if (x % 2 == 0)
printf("%lld\n", x / 2L);
else
printf("%.1f\n", x / 2.0);
}
我觉得这有点奇怪,因为在我看来这两个函数的结果相同。
最佳答案
您的第一个版本没有正确处理值 -1
。如果你运行 printHalf(-1)
它将打印 0.5
,因为它不知道它需要显示 -0
而不是 0
。
对于其他负值,它将在 C++11 中正常工作,但依赖于 C++03 中实现定义的行为(C++03 标准未指定如何舍入负数除法)。
第二个版本也可能打印不正确的结果:如果值很大,转换为 float 会降低精度(因为 double float 不能准确表示所有 64 位整数),所以结果可能会偏离一点。
关于c++ - 一个奇怪的打印功能错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744177/