Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算A,B,C的(A*B)%C<;=10^18,用C+表示+;?_C++_Product_Long Integer_Modulo_Integer Arithmetic - Fatal编程技术网

C++ 如何计算A,B,C的(A*B)%C<;=10^18,用C+表示+;?

C++ 如何计算A,B,C的(A*B)%C<;=10^18,用C+表示+;?,c++,product,long-integer,modulo,integer-arithmetic,C++,Product,Long Integer,Modulo,Integer Arithmetic,例如,A=10^17,B=10^17,C=10^18 产品A*B超出了long long int的限制。 此外,写入((A%C)*(B%C))%C也没有帮助。您可以使用 GNU多精度算术库 或 C++大整数库 如果只使用10的幂,可以创建一个包含2个成员的简单类:一个基数和10的幂,因此a=10^17将是{1,17}。实现加法、减法、乘法和除法非常简单,打印也很简单。如果您想保持在64位整数运算范围内,可以使用二进制长除法,它可以归结为一系列加法和乘法乘以两个运算。这意味着您还需要这

例如,A=10^17,B=10^17,C=10^18
产品A*B超出了long long int的限制。
此外,写入((A%C)*(B%C))%C也没有帮助。

您可以使用

  • GNU多精度算术库

  • 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;
}
//假设a和b已经小于m
公共静态长addMod(长a、长b、长m){
如果(a+b<0)
return(a-m)+b;//避免溢出
如果(a+b>=m),则为else
返回a+b-m;
其他的
返回a+b;
}
//假设a和b已经小于m
公共静态长倍数(长a、长b、长m){
如果(b==0 | | a c当且仅当a>c/b
//a*b将溢出;二进制长除法:
长结果=0;
如果(a>b){
长c=b;
b=a;
a=c;
}
而(a>0){
如果((a&1)!=0){
结果=addMod(结果,b,m);
}
a>>=1;

//MathOverflow上的compute b似乎有关联您可以应用数学来查找快捷方式,尽管这不一定会让您找到适合
long long int
的数字(在这种情况下,我认为这不仅仅是因为结果可能会大到10^18)在这种情况下,你需要任意的析取整数。显然,非最佳的算法应该是10位18的数,它只有几十个数字,而不管基数。C++代码几乎是一样的,改变<代码>长< /COD>到<代码>长长和<代码>长。