Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';我的幂函数以2为基,n为指数,计算出的答案模为10^9+;7._C++_Exponentiation - Fatal编程技术网

C++ 什么';我的幂函数以2为基,n为指数,计算出的答案模为10^9+;7.

C++ 什么';我的幂函数以2为基,n为指数,计算出的答案模为10^9+;7.,c++,exponentiation,C++,Exponentiation,我的代码: 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

我的代码:

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;
}

我曾经让它更有效率,我知道有些地方不对劲,因为
n=1000
的输出生成
495105785
,而正确的答案是
688423210


我甚至尝试将返回数据类型更改为long-long,以检查行
9
12
中可能出现的溢出,但答案仍然是一样的。任何帮助都将不胜感激。

如果int为32位或更小,则存储*存储可能溢出。使用溢出安全计算


一种替代方法可以是
(int)(storage*1LL*storage%num)
和类似的奇数功率情况。

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

输出:

688423210

你是说既然我声明
storage
int
中间
storage*storage
将仅存储为
int
?即使我已经将返回类型设置为
long
?@AradhyeAgarwal否,我是说如果存储等于2^30,那么
storage*storage
将是2^60,它将被截断为2^32,但您不想截断,您需要整个2^60计算。@AradhyeAgarwal不仅返回类型应该是长的,但也包括所有可能溢出的中间计算。@AradhyeAgarwal事实上,您可以将返回类型保留为int,只有中间乘法和除法应该作为int-64进行。因为结果总是在32位以内,而中间结果可能是64位。
1000
688423210