我需要计算这样的东西(伪代码):
// a, b, x, y are long, x,y <= 10^12
long i = (a - n)/(x*y)
和
long j = (b - n)/(x*y) - ceiling
有时x * y不合适。我想避免使用BigDecimal / BigInteger,因为它太贵了,在其他任何地方都不需要。是否有一个聪明的数学解决方案,例如有两个这样的长或长?
谢谢!
更新:不好意思,伙计们,还有一个约束:我也有一个如下计算的变量(也许也可以重写):
sum += x*y
我需要重新计算它以便与另一个变量进行比较以终止循环。
答案 0 :(得分:0)
您可以分两次
type
很难理解您如何准确地使用此y = a / (b * c)
y1 = a / b
y = y1 / c
以及如何计算比较值,但是可以存储比较的结果而不是避免使用较大的值,例如sum
> 0则result
较大,如果结果<0则其他值较大,...
答案 1 :(得分:0)
我注意到比较sum
的值很长。因此,我通过以下方式解决了这个问题:
i
:(long)((((a-n)/(double)x)/ y))j
:(长)Math.ceil((b-n)/(double)x * y)上述情况当然会溢出。但我避免在执行以下try-catch之前溢出:
try {
xy = Math.multiplyExact(x, y);
...
} catch (ArithmeticException ex) {
// some handling
break;
}
这种由代码制作的技巧足以使工作更快。
希望它对某人有帮助!