如何解决我的幂函数有什么问题,以2为底,n为指数并以10 ^ 9 + 7为模计算答案?
我的代码:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。