【发布时间】:2015-07-30 02:38:47
【问题描述】:
基本上,只要指数是偶数,我就会使用经典的分而治之,然后想出这个。
int mymod(int a,int b){ //returns only positive value between 0 to b-1
return a%b<0 ? (a%b)+b : a%b;
}
int Solution::pow(int x, int n, int d) {
if(n==0) return mymod(1,d);
int result = 1;
while(n>0){
if(n%2 == 1)
result = mymod((result * x),d);
n = n>>1; //dividing exponent by 2, if it's even. Divide and conquer whenever exponent is even
x = mymod(x*x,d);
}
return result;
}
现在我正在使用 mymod 函数来计算模数,因为正常模数给了我一个 -ve 结果,这与测试用例不符。我需要用整数来实现它。这里有一件重要的事情需要注意。溢出情况。一些测试用例有足够大的 x,当乘以时可能会溢出。 下面是这个程序应该满足的一些测试用例。
X : 0
N : 0
D : 1
expected output: 0
X : -1
N : 1
D : 20
expected output: 19
X : 71045970
N : 41535484
D : 64735492
expected output: 20805472
上面的代码满足前两个测试用例(TRIVIAL)但在最后一个测试用例失败。 OJ 也接受 Python,如果是 Python,我需要一些解释。谢谢!!
【问题讨论】:
-
那么你的问题是什么?模幂运算是密码学中非常常见的运算。找到算法并不难,对于相当大的
x、n和d,它会很快完成。 -
你帖子里的OJ是什么?
-
你的问题是什么?
-
@tuananh 我认为 Online Judge
-
Python 有一个强大的内置
pow()函数,它接受第三个参数来指定模数。而且因为它是内置的,所以它始终可用,不需要导入任何模块。
标签: python c++ algorithm pow divide-and-conquer