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