假设我有两个long long,a和b,我需要相乘,然后得到值k对于一些大的k,这样a,b和k都在long long的范围内,但不是int 。为简单起见,a,b < k。在C++中int(或long long)溢出如何影响模数?
因此,代码将是:
long long a, b, k;
cin >> a >> b >> k;
cout << (a * b)%k << "\n";
然而,因为a,b是如此之大,如果乘像上面,并且溢出和变为负,则模k将是一个负数和不正确。
如何确保值mod k是正确的?
编辑:作为奖金,这是如何在Java中工作?是否如预期的那样?还是BigInteger需要?
查看http://stackoverflow.com/questions/4240748/allowing-signed-integer-overflows-in-c-c – juanchopanza
a,b
nneonneo
尝试使用(a * b)%k ==((a%k)*(b%k))%k的事实。如果k小于long,这将起作用。如果没有,你将需要做一些简单的多精度。 –