2013-04-12 6 views
1

Согласно this answer, если я хочу проверить, что один номер несколько раз, я могу использовать оператор остатка %.В чем причина этого, казалось бы, перепрограммированного кода для проверки одного числа, кратного другому?

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

Еще в this fun project, которая полна намеренно overengineered кода они используют следующий подход:

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

, который фактически делит number на anotherNumber и затем умножает его обратно и проверяет, что результат number.

Имеет ли второй подход какой-либо практический смысл или он просто намеренно перегружен?

+0

(Обратите внимание, что существуют, видимо, запутанные условия, подобные этому, которые корректно обрабатывают целочисленные условия переполнения, тогда как очевидная версия не делает этого. Не упрощайте такой код. По крайней мере, пока вы не перейдете на язык с разумными целыми числами .) –

+1

Проект, с которым вы связаны, предназначен для пародии (и вы выделили столько же в своем сообщении). Я почти уверен, что ответ заключается в том, что он был намеренно переработан, потому что это то, что кодер собирался сделать. Вероятно, можно с уверенностью предположить, что он не имеет практического значения :) – PT114

+0

Было бы иметь значение, если 'number' является' long', 'float' или' double', но неясно, что это за тип. –

ответ

2

выглядит Автор второго кода не знал, оператора% и использует умножение, чтобы проверить, существует ли оставшаяся часть или нет :)

+1

+1, «никогда не приписывайте злобу то, что можно объяснить глупостью» – Brian

1

непосредственно следует из определения оператора остатка (JLS §15.17.3), что два семантически эквивалентны:

операция остатка для операндов, которые являются целыми числами после двоичного числовое расширение (§5.6.2) производит результирующее значение таким образом, что (a/b)*b+(a%b) равно a.

Следовательно, нет никаких преимуществ для более сложного подхода.

Я не могу сказать, почему автор написал так, как они сделали, но тот факт, что они сочли необходимым привести результат целочисленного деления на int может дать подсказку ...

0

Нет , это, очевидно, случай меньшей квалификации программиста. Modulo встречается на любом курсе компьютерной науки на начальном уровне. Сложная инженерия, возможно, следовала за аналогичным отсутствием фона/практики.

P.S. Я бы не стал недооценивать заинтересованного лица.

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, тогда и только тогда DeVision number/anotherNumber имеет целочисленный результат.

Поэтому

if(number % anotherNumber == 0) 

и

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

истинны в тех же случаях. Я уверен, что первая версия имеет лучшую производительность.

Я уверен, что программист, который написал код, либо не знал об % -операторе, либо не думал об этом в этом случае.