[英]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.