如何在不引入除法的前提下简化含三元运算符的整数运算代码?
简化方案(无除法)
当然可以简化,核心是找到y正负两种情况的统一逻辑:
原代码中,y>0时用c < y*a,y<0时用c > y*a——这两个条件可以通过两边同乘y(y≠0时y²为正,不等号方向的变化会刚好统一成同一种比较)来合并:
- y>0时,
c < y*a→ 两边乘y(正)得c*y < y²*a - y<0时,
c > y*a→ 两边乘y(负)得c*y < y²*a(不等号反转)
同理,第二个条件也可以做同样转换。同时要注意整数溢出问题,所以用long long存储中间计算结果更稳妥。
简化后的代码(防溢出版)
int x = 0; if (y != 0) { long long cy = (long long)c * y; long long ya_sq = (long long)y * a * y; long long yb_sq = (long long)y * b * y; x = cy < ya_sq ? 1 : cy < yb_sq ? 2 : 4; }
紧凑版(假设无溢出风险)
如果你的场景不会出现整数溢出,也可以写成更简洁的形式:
int x = 0; if (y) { // y≠0时非零为真 x = (c*y < y*y*a) ? 1 : (c*y < y*y*b) ? 2 : 4; }
直观符号变量版
也可以用符号变量统一比较逻辑,可读性更强:
int x = 0; if (y != 0) { int sign = y > 0 ? 1 : -1; long long ya = (long long)y * a; long long yb = (long long)y * b; x = (sign * c) < ya ? 1 : (sign * c) < yb ? 2 : 4; }
以上几种写法都完全等价于原代码逻辑,且未引入除法,同时缩短了代码长度。
内容的提问来源于stack exchange,提问作者user27772
相关产品推荐
相关产品推荐

