问题描述
我的代码:
int power(int n)
{
int num = 1000000007;
if (n == 0)
return 1;
if (n%2 == 1)
{
int storage = power((n-1)/2);
return (2*storage*storage)%num;
}
int storage = power(n/2);
return (storage*storage)%num;
}
我已经使用exponentiation by squaring来提高效率,我知道有些错误,因为n= 1000
的输出会生成495105785
,而正确的答案是688423210
。 / p>
我什至尝试将return数据类型更改为long long以检查在9
和12
行中可能发生的溢出,但是答案仍然相同。任何帮助将不胜感激。
解决方法
如果int为32位或更小,
storage * storage
可能会溢出。使用溢出安全计算。
一个替代方案可以是(int)(storage * 1LL * storage % num)
,对于奇数幂情况也可以类似。
storage * storage
有时可能会溢出int
值,例如如果存储空间为2 ^ 30,则storage * storage
为2 ^ 60,它将被截断为int
以适合2 ^ 32,但您要进行全尺寸计算,否则会得到错误的余数。使用int64_t
获得中间结果,例如下面的代码:
#include <cstdint>
#include <iostream>
using namespace std;
int power(int n)
{
int64_t num = 1000000007;
if (n == 0)
return 1;
if (n % 2 == 1)
{
int64_t storage = power((n - 1) / 2);
return (2 * storage * storage) % num;
}
int64_t storage = power(n / 2);
return (storage * storage) % num;
}
int main() {
cout << power(1000) << endl;
return 0;
}
输入:
1000
输出:
688423210