繁体   English   中英

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

[英]Implementing pow(A, B) % C using Recursion where A, B and C are positive integers

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

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;

我无法区分两者。 在我看来,它们看上去基本相同。 请告诉我为什么我的代码是错误的。

该问题与运算符优先级无关。 *%在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 ,否则将无法编译。

暂无
暂无

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

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