使用递归实现pow(A,B)%C,其中A,B和C是正整数

时间:2017-01-07 19:58:18

标签: c++ function recursion

下面是我的函数,它在某些输入上输出错误(我猜的只有大输入):

Mod(int A, int B, int C) {
    long long y = 0;
    if(B == 0)
        return 1;

    if(B%2 == 1) {
        y = (A%C * Mod(A, B-1, C)) % C;
    }

    else {
        y = Mod(A, B/2, C);
        y = (y*y) % C;
    }

    return (int)y;
}

在输入A = 71045970,B = 41535484和C = 64735492时,此函数返回10848368,而正确答案为20805472。

在正确的程序中,我的程序行:

y = (A%C * Mod(A, B-1, C)) % C;

需要替换为:

y = A%C; y = (y * Mod(A, B-1, C)) % C;

我无法区分这两者。对我来说,他们看起来基本相同。请告诉我为什么我的代码错了。

1 个答案:

答案 0 :(得分:0)

问题与运营商优先级无关。 *%在C和C ++中具有相同的优先级和左右关联性。

这是因为

y = (A%C * Mod(A, B-1, C)) % C;

将右侧的所有计算作为int执行,对于较大的值可能会溢出,然后将结果转换为long long以将其存储在y中。

表格

y = A%C;
y = (y * Mod(A, B-1, C)) % C;

在第二个语句中使用long long而不是int导致算术运算。在进行乘法Mod(A,B-1,C)之前,long long的结果会提升为(y * Mod(A, B-1, C),结果的类型为long long。同样,C也会提升为long long,而右侧的表达式会提升为long long

注意:在C ++中,您需要从函数中显式返回int,否则将无法编译。