2016-04-23 17 views
1

私のコードは次のようであるlong long型に相対的です。 しかし、2つの数字14159572 63967072を入力すると、負の数-527892768が出力されますが、正解は226436590403296になります。 出力が32ビットにカットされているようです。 ので、私は変数temp_gcdを印刷し、4.Iは、それが正しい答えを出力奇妙なC++のエラーは、多分

long long result = abproduct/4; 

に表現

long long result = abproduct/temp_gcd; 

を変更しました。 abの両方intあるので

+0

符号なしの型をすべて使用することをお勧めします: '%'演算子は負の右のオペランドでは動作しませんので、精度が少し向上し、オーバーフローによる未定義の動作が回避されます。おそらく 'uintmax_t'を使用してください –

答えて

1

これはオペランドのデータ型であるため、intの乗算を実行しています。そのデータ型を変更します。キャストは常に政治家や外交官が失敗した後にのみ(戦争に行くような、最後の手段でなければなりません:つまり、キャストを使用するようにアドバイスを取ってはいけない

long long lcm(long long a, long long b) 

long long lcm(int a, int b) 

を変更します)。

関数の署名を変更しない場合は、a*b1LL*a*bに置き換えて変換を強制することができます。しかし、私はここでそれをお勧めしません。適切なデータ型を使用するのが正しい方法です。

はさらに、コード

long long abproduct = a*b; 
long long result = abproduct/temp_gcd; 

は不用意結果がオーバーフローすることができるケースを追加します。

long long result = a*(b/temp_gcd); 

がこの情報を破棄することができないことに注意し、それを減らすために(一般的に、しかし、あなたは、整数の除算廃棄情報について注意する必要があります)。

2

問題がラインlong long abproduct = a*b;

上にある、それらの任意の操作は、この場合にオーバーフローをもたらすであろう、intをもたらすであろう。計算を行うときにaまたはblong longにキャストしてみてください。

long long abproduct = (long long)a * b;

+0

別の方法は' 1LL * a * b'です –

0

は@ MahlerFiveの答えを編集したくなかった - あまりにも動作するはずです。私はaとbをlong long likeにキャストします:long long abproduct = static_cast<long long>(a)*static_cast<long long>(b)