【发布时间】:2015-01-15 17:07:42
【问题描述】:
我在 C 中得到了一个模幂函数,看起来像这样。
int modexp(int m, int e, int n)
{
printf("%i\n", m);
printf("%i\n", e);
printf("%i\n", n);
printf("\n");
if(e == 0)
{
return 1;
}
if(e%2 == 1)
{
return modexp(m, e-1, n) * m%n;
}
else
{
int modTemp = modexp(m, (int)(e/2), n);
modTemp = modTemp * modTemp;
return modTemp % n;
}
}
我在我的main() 函数中调用它
int p = 3511;
printf("%i\n", modexp(2, p-1, p*p));
当打印 m、e 和 n 的值时,我最终得到了正确的递归值,直到 e = 0。这是函数应该返回 1 的时候。它肯定会在代码中的那个位置返回,但是我得到的不是预期的整数 1,而是 -6593454,我不知道为什么。
完整的代码可以在这里找到: https://gist.github.com/anonymous/7024ac77b2432a381968
任何意见都非常感谢......
【问题讨论】:
-
这只是一个简单的整数溢出情况。将
#include <inttypes.h>添加到代码顶部,并将int更改为uint64_t并将%i更改为%llu。
标签: c return return-value integer-overflow exponentiation