Java判断三个输入数是否有两个偶数为何要用乘法,能否用加法替代
三个数判断至少存在两个偶数的逻辑说明
现有代码的运行原理
我们可以先把所有整数的奇偶性简化为1(奇数)、0(偶数),所有加减乘的模2结果只和奇偶性有关,和数值本身无关:
- 第一个判断条件
sumOfNumbers % 2 != 0:三个数的和为奇数时,等价于三个数里有奇数个奇数,也就是要么1个奇数、要么3个奇数。对应偶数的数量就是2个或者0个,刚好过滤掉偶数数量为1、3的场景,剩下需要区分的就是「3个全奇(0个偶数)」和「2个偶数1个奇数」两种场景。 - 第二个判断条件
firstNumber * secondNumber % 2 == 0:整数相乘结果为偶数的充要条件是至少有一个乘数是偶数,这个条件刚好用来区分上面剩下的两种场景:- 如果是3个全奇:前两个数都是奇数,乘积为奇数,模2结果为1,条件不成立,整体返回false,符合预期
- 如果是2个偶数1个奇数:最多只有1个奇数,前两个数里至少有一个偶数,乘积为偶数,模2结果为0,条件成立,整体返回true,符合预期
注意:现有代码存在逻辑缺陷,三个数全为偶数时,和为偶数,第一个条件不成立,会返回false,不符合「至少两个偶数」的需求。如果需要覆盖全偶场景,可以直接用更直观的逻辑:统计奇数的个数,只要奇数个数≤1,就说明偶数个数≥2:
boolean if2NumbersEven = (firstNumber%2 + secondNumber%2 + thirdNumber%2) <= 1;
能不能用加法代替乘法
完全可以,不存在只能用乘法的限制。这里乘法的作用只是判断「前两个数不全为奇数」,只要用加法写出等价的判断逻辑即可,参考写法如下:
// 等价于乘法写法的判断逻辑:两个数的奇偶性相加不等于2,就说明不会两个都是奇数 (firstNumber % 2 + secondNumber % 2) != 2
内容的提问来源于stack exchange,提问作者user15599360
相关产品推荐
相关产品推荐

