这个看似过度设计的代码检查一个数字是另一个数字的倍数的原因是啥?

Posted

技术标签:

【中文标题】这个看似过度设计的代码检查一个数字是另一个数字的倍数的原因是啥?【英文标题】:What's the reason for this seemingly overengineered code for checking one number is a multiple of another?这个看似过度设计的代码检查一个数字是另一个数字的倍数的原因是什么? 【发布时间】:2013-04-12 07:44:22 【问题描述】:

根据this answer,如果我想检查一个数字是另一个数字的倍数,我可以使用余数运算符%

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

然而在充满故意过度设计代码的this fun project 中,他们使用以下方法:

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

实际上是将number 除以anotherNumber,然后将其相乘并检查结果是否为number

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

【问题讨论】:

(请注意,显然有像这样的混淆条件可以正确处理整数溢出条件,而明显的版本不能。不要简化那种代码。至少在你搬到一种具有合理整数的语言。) 您链接到的项目是为了模仿(并且您在帖子中强调了同样多的内容)。我很确定答案是故意过度设计,因为这就是编码器的目的。假设它没有实际意义可能是安全的:) 如果numberlongfloatdouble 会有所不同,但不清楚是什么类型。 如果您想要一个真正的答案,而不仅仅是为了发布 *** 问题:询问作者。 @AlexG:如果我只想知道这是否是一种公认​​的设计模式,我为什么要问作者? 【参考方案1】:

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

【讨论】:

+1, "永远不要把可以用愚蠢来解释的事情归咎于恶意"【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

附:我不会小看当事人。

【讨论】:

【参考方案4】:

例子

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,要么在这种情况下没有考虑过。

【讨论】:

以上是关于这个看似过度设计的代码检查一个数字是另一个数字的倍数的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 is_numeric() 在传递看似数字的字符串时返回 false?

使用 WITH 和过度分区困难更新表

数字游戏

2003数字游戏

检查mysql表中的变量并调整数字

装配检查数字是否均匀