首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免算术溢出

避免算术溢出
EN

Stack Overflow用户
提问于 2012-02-27 01:24:39
回答 4查看 347关注 0票数 2

假设您有两个大于2^32 (小于2^63)的正longab,以及一个长整型c。在java和\或c中,执行以下操作的最佳方法是什么?

代码语言:javascript
复制
(a*b)%c

同时避免算术溢出。

编辑:C在2^34附近,有时a和b都在2^32c之间……

对于我所处的特定情况,我最终避免了使用BigInteger。实际上,知道ab的一个因子是可能的(并不总是这样),所以我会利用modulo的算术属性。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-27 01:27:37

假设一切都是肯定的,那么你可以使用下面的数学等式:

代码语言:javascript
复制
(a*b)%c == ((a%c) * (b%c)) % c

当然,这仍然不能消除溢出的可能性。

完全避免这个问题的最简单的方法是使用一个大整数库。

票数 8
EN

Stack Overflow用户

发布于 2012-02-27 02:00:56

你可以比@Oli Charlesworth在他的(很好的)答案中建议的更进一步。您可以在因子ab中进行分解(在所有的素因子中不是必需的,部分分解可能就足够了),并在乘法的任何中间结果中执行模运算。虽然这可能比bignum的成本更高,因为它涉及相当多的部门,而且它们很昂贵。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 01:40:46

在Java中,我会使用BigInteger

代码语言:javascript
复制
BigInteger bd = BigInteger.valueOf(2).pow(33);
System.out.println(bd.multiply(bd).remainder(BigInteger.valueOf(2).pow(34).add(BigInteger.valueOf(1))));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9455296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档