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
}

它实际上是除以number然后anotherNumber乘回来并检查结果是否为number.

第二种方法是否有任何实际意义,还是只是故意过度设计?

4

4 回答 4

2

看起来第二个代码的作者不知道 % 运算符并使用乘法来验证是否有余数部分:)

于 2013-04-12T07:47:57.240 回答
1

直接从余数运算符的定义(JLS §15.17.3)得出两者在语义上是等价的:

在二进制数值提升(第 5.6.2 节)之后,整数操作数的余数运算会产生一个结果值,(a/b)*b+(a%b)例如a

因此,更复杂的方法没有优势。

我不能说作者为什么以他们的方式写它,但他们认为有必要将整数除法的结果转换为这一事实int可能会给出提示......

于 2013-04-12T07:48:36.300 回答
0

不,这显然是程序员资质较低的情况。在任何初级计算机科学课程中遇到模一。过度设计可能是由于缺乏类似的背景/实践。

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 回答