我的幂函数有什么问题,以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以检查在912行中可能发生的溢出,但是答案仍然相同。任何帮助将不胜感激。

解决方法

如果int为32位或更小,

storage * storage可能会溢出。使用溢出安全计算。

一个替代方案可以是(int)(storage * 1LL * storage % num),对于奇数幂情况也可以类似。

,

storage * storage有时可能会溢出int值,例如如果存储空间为2 ^ 30,则storage * storage为2 ^ 60,它将被截断为int以适合2 ^ 32,但您要进行全尺寸计算,否则会得到错误的余数。使用int64_t获得中间结果,例如下面的代码:

Try it online!

#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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...