java - 动态 Java 整数/长溢出检查与性能

标签 java algorithm integer overflow factorial

这是一个相当理论化的问题,因此虽然该语言专门针对 Java,但任何通用解决方案都足够了。

假设我想写一个平凡的阶乘函数:

long factorial(int n)
{
    //handle special cases like negatives, etc.

    long p = 1;
    for(int i = 1; i <= n; i++)
    {
        p = p * n;
    }
    return p;
}

但现在,我还想检查阶乘是否溢出(无需简单地硬编码 MAX_FACTORIAL_PARAMETER 或类似的东西)。一般来说,在乘法过程中检查溢出与根据原始输入检查结果一样简单,但在这种情况下,由于溢出可能发生在任何时候,因此在每个循环中执行更多的除法和比较会相当昂贵。

那么问题是双重的——有没有办法解决溢出的阶乘问题,而不用在每一步检查乘法溢出或硬编码最大允许参数?

一般来说,我应该如何处理涉及多个迭代/递归阶段的问题,这些阶段可能会在每个阶段默默失败,而不会通过在每个阶段引入昂贵的检查来影响性能?

最佳答案

虽然 Java 不能帮助您解决这个问题,但肯定有一些语言可以帮助解决溢出问题。例如,C# 提供了 checked keyword .在下面,此功能可能使用 overflow flag 形式的硬件支持。 .

关于java - 动态 Java 整数/长溢出检查与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6721316/

相关文章:

java - Hibernate 将不会更新具有可为空 OrderColumn 的表

java - Runnable run() 函数立即终止

algorithm - "find the line that contains the maximum number of points in P"的哈希函数

c - 关于C中的整数提升,简短

java:将整数作为无符号 8 位整数写入文件

java - JPA 整数鉴别器值

algorithm - 如何提高 `concorde` TSP 求解器的质量?我在滥用它吗?

java - 构建叶图 - 成对的祖先列表(父 - 子)

c++ - 对于每个标量 `T` ,是否可以保证存在相同大小的整数?

java - hibernate 和 spring 中没有 session 代理