【问题标题】:Is there a way to avoid BigInteger/BigDecimal?有没有办法避免 BigInteger/BigDecimal?
【发布时间】:2019-05-29 19:56:48
【问题描述】:

我需要计算这样的东西(伪代码):

// 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

我需要重新计算它以与另一个变量进行比较以停止循环。

【问题讨论】:

标签: java algorithm optimization bigdecimal


【解决方案1】:

我注意到我正在比较 sum 的值很长。所以我通过以下方式解决了这个问题:

  • 我正在这样计算i:(long) (((a - n) / (double) x) / y))
  • 这里是j: (long) Math.ceil((b - n) / (double) x*y)
  • 上面的情况当然会溢出。但我防止溢出之前执行以下 try-catch:

            try {
                    xy = Math.multiplyExact(x, y);
                    ...
            } catch (ArithmeticException ex) {
                    // some handling
                    break;
            }
    

这个由代码制作的技巧运行得足够快。

希望它对某人有所帮助!

【讨论】:

    【解决方案2】:

    你可以分两次

    y = a / (b * c) 
    
    y1 = a / b
    
    y = y1 / c
    

    很难理解您如何准确地使用此 sum 以及如何计算比较值,但是否可以存储比较结果以避免较大的值,例如 if result > 0 then @987654324 @ 较大,如果结果

    【讨论】:

    • 似乎是合理的,但我还需要存储此类m*w 的当前总和,对不起,我已经更新了问题
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2011-09-13
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多