目前,我的最大努力导致了复杂度O(log [n] ^ 2):
int power(x,n)
{
int mult=1, temp=x, i=1, j=1;
while (n>1)
{
mult=mult*x;
x=temp;
for (i=1;i<=log[n];i++)
{
x=x*x;
j=j*2;
}
n=n-j;
i=1;
j=1;
}
if (n==1)
return (mult*temp);
return (mult);
}
P.S 谢谢funkymushroom帮我解决了我的英语不好:)
答案 0 :(得分:6)
在对数时间内实现此操作的想法是使用以下(数学)等价(此处n / 2表示整数除法):
x ^ 0 = 1
x ^ n =(x n / 2 ) 2 ,如果n%2 == 0
x ^ n = x *(x n / 2 ) 2 ,如果n%2 == 1
这可以很容易地按照以下方式递归实施:
int power(int x, int n) {
if (n == 0) {
return 1;
} else {
int r = power(x, n / 2);
if (n % 2 == 0) {
return r * r;
} else {
return x * r * r;
}
}
}
这样的实现将产生O [log(n)]复杂度,因为在递归的每个步骤中输入(变量n)减半。
答案 1 :(得分:0)
您需要的是使用重复的平方。 Check this out