下面是我的函数,它在某些输入上输出错误(我猜的只有大输入):
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;
我无法区分这两者。对我来说,他们看起来基本相同。请告诉我为什么我的代码错了。
答案 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
,否则将无法编译。