1

この回答によると、ある数値が別の数値の倍数であることを確認したい場合は、剰余演算子を使用できます%

 if( number % anotherNumber == 0 ) {
    number is a multiple of anotherNumber
 }

しかし、意図的に過度に設計されたコードでいっぱいのこの楽しいプロジェクトでは、次のアプローチを使用しています。

// int number;
// int anotherNumber;
if ((((int)(number / anotherNumber)) * anotherNumber == number)) {
    number is a multiple of anotherNumber
}

実際には、 で割っnumberanotherNumberから乗算し、結果が であることを確認しますnumber

2 番目のアプローチには実際的な意味がありますか、それとも意図的に過度に設計されているだけですか?

4

4 に答える 4

2

2 番目のコードの作成者は % 演算子を知らず、乗算を使用して剰余部分があるかどうかを確認しているようです :)

于 2013-04-12T07:47:57.240 に答える
1

剰余演算子の定義 (JLS §15.17.3 ) から、2 つが意味的に同等であることが直接わかります。

バイナリ数値昇格 (§5.6.2) 後の整数であるオペランドの剰余演算は、(a/b)*b+(a%b)に等しい結果値を生成しaます。

したがって、より複雑なアプローチには利点がありません。

なぜ作者がそのように書いたのかはわかりませんが、整数除算の結果をキャストする必要があると感じたという事実はint、ヒントを与えるかもしれません...

于 2013-04-12T07:48:36.300 に答える
0

いいえ、これは明らかにプログラマーの資格が不足している場合です。モジュロ 1 は、初等レベルのコンピュータ サイエンス コースで遭遇します。過度のエンジニアリングは、同様の背景/実践の欠如から生じた可能性があります。

PS私は関係者を過小評価しません。

于 2013-04-12T07:53:53.413 に答える
0

number = 13
anotherNumber = 4
number / anotherNumber = 13 / 4 = 3.25  // if  number or anotherNumber has type float or double
(int)(number / anotherNumber) = 3
(((int)(number / anotherNumber)) * anotherNumber = 3 * 4 = 12

number除算のnumber / anotherNumber結果が整数である場合、結果は と同じであることがわかります。

したがって

if( number % anotherNumber == 0 ) 

if ((((int)(number / anotherNumber)) * anotherNumber == number))

同じ場合に真です。最初のバージョンの方がパフォーマンスが優れていると確信しています。

コードを書いたプログラマーが%-operator について知らなかったか、この場合について考えていなかったと確信しています。

于 2013-04-12T07:54:04.617 に答える