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);
}

私の意見では、2つの関数の結果は同じであるため、少し奇妙に見えます。

4

1 に答える 1

3

-1最初のバージョンは値を適切に処理しません。実行printHalf(-1)すると、の代わりに0.5表示する必要があることがわからないため、が出力されます。-00

その他の負の値については、C ++ 11で正しく機能しますが、C ++ 03での実装定義の動作に依存します(C ++ 03標準では、負の数の除算の丸め方法は指定されていません)。

2番目のバージョンでも誤った結果が出力される可能性があります。値が非常に大きい場合、浮動小数点に変換すると精度が低下するため(倍精度浮動小数点はすべての64ビット整数を正確に表すことができないため)、結果がオフになる可能性があります。少しずつ。

于 2012-12-06T13:07:05.610 に答える