【发布时间】:2015-06-14 20:50:01
【问题描述】:
假设我有两个 long long,a 和 b,我需要相乘,然后得到一些大 k 的值 mod k,这样 a、b 和 k 都在 long long 的范围内,而不是诠释。为简单起见,a, b
因此代码将是:
long long a, b, k;
cin >> a >> b >> k;
cout << (a * b)%k << "\n";
但是,由于 a 和 b 如此之大,如果你像上面那样相乘,它会溢出并变成负数,那么 mod k 将是一个负数并且不正确。
如何确保值 mod k 是正确的?
编辑:作为奖励,这在 Java 中是如何工作的?和预期的一样吗?还是需要 BigInteger?
【问题讨论】:
-
a,b
-
尝试使用 (a * b) % k == ((a % k) * (b % k)) % k 的事实。如果 k 小于 long 这将起作用。如果没有,您将需要做一些简单的多精度。
-
从技术上讲,当您使用有符号值时,“溢出”之后的所有内容都是未定义的行为;任何事情都可能发生,
-
@RichardCritten,请在回答之前阅读问题和 cmets。 nneonneo 已经在您的正上方的评论中指出a,b
标签: c++ long-integer modulus integer-overflow