繁体   English   中英

如何在C ++中计算A,B,C <= 10 ^ 18的(A * B)%C?

[英]How can I calculate (A*B)%C for A,B,C <= 10^18, in C++?

例如,A = 10 ^ 17,B = 10 ^ 17,C = 10 ^ 18。
乘积A * B超出long long int的限制。
同样,写((A%C)*(B%C))%C也无济于事。

您可以使用

要么

如果仅使用10的幂次幂,则可以创建一个包含2个成员的简单类:一个基数和10的幂次,因此A = 10 ^ 17将为{1,17}。 实现加,减,乘和除非常容易,打印也很容易。

假设您希望保留在64位整数运算之内,则可以使用二进制长除法,将其归结为一堆加法并乘以两个运算。 这意味着您还需要那些运算符的防溢版本,但是它们相对简单。

这是一些Java代码,假设A和B已经为正且小于M。如果不是,则可以很容易地事先将它们设置为正。

// assumes a and b are already less than m
public static long addMod(long a, long b, long m) {
    if (a + b < 0)
        return (a - m) + b;  // avoid overflow
    else if (a + b >= m)
        return a + b - m;
    else
        return a + b;
}

// assumes a and b are already less than m
public static long multiplyMod(long a, long b, long m) {
    if (b == 0 || a <= Long.MAX_VALUE / b)
        return a * b % m;   // a*b > c if and only if a > c/b
    // a * b would overflow; binary long division:
    long result = 0;
    if (a > b) {
        long c = b;
        b = a;
        a = c;
    }
    while (a > 0) {
        if ((a & 1) != 0) {
            result = addMod(result, b, m);
        }
        a >>= 1;
        // compute b << 1 % m without overflow
        b -= m - b; // equivalent to b = 2 * b - m
        if (b < 0)
            b += m;
    }
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM