0

我正在处理一个 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);
}

我觉得这有点奇怪,因为在我看来这两个函数有相同的结果。

4

1 回答 1

3

您的第一个版本没有-1正确处理该值。如果你运行printHalf(-1)它会打印0.5,因为它不知道它需要显示-0而不是0.

对于其他负值,它将在 C++11 中正常工作,但依赖于 C++03 中实现定义的行为(C++03 标准未指定如何舍入负数的除法)。

第二个版本也可能打印不正确的结果:如果值很大,转换成浮点数会降低精度(因为双精度浮点数不能准确表示所有64位整数),所以结果可能是off一点点。

于 2012-12-06T13:07:05.610 回答