61 lines
1.0 KiB
Markdown
61 lines
1.0 KiB
Markdown
|
---
|
|||
|
title: Exponentiation
|
|||
|
localeTitle: 幂
|
|||
|
---
|
|||
|
## 幂
|
|||
|
|
|||
|
给定两个整数a和n,写一个函数来计算^ n。
|
|||
|
|
|||
|
#### 码
|
|||
|
|
|||
|
算法范式:分而治之。
|
|||
|
|
|||
|
```C
|
|||
|
int power(int x, unsigned int y) {
|
|||
|
if (y == 0)
|
|||
|
return 1;
|
|||
|
else if (y%2 == 0)
|
|||
|
return power(x, y/2)*power(x, y/2);
|
|||
|
else
|
|||
|
return x*power(x, y/2)*power(x, y/2);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
时间复杂度:O(n)|空间复杂度:O(1)
|
|||
|
|
|||
|
#### 优化的解决方案:O(logn)
|
|||
|
|
|||
|
```C
|
|||
|
int power(int x, unsigned int y) {
|
|||
|
int temp;
|
|||
|
if( y == 0)
|
|||
|
return 1;
|
|||
|
temp = power(x, y/2);
|
|||
|
if (y%2 == 0)
|
|||
|
return temp*temp;
|
|||
|
else
|
|||
|
return x*temp*temp;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 模块化指数
|
|||
|
|
|||
|
给定三个数字x,y和p,计算(x ^ y)%p
|
|||
|
|
|||
|
```C
|
|||
|
int power(int x, unsigned int y, int p) {
|
|||
|
int res = 1;
|
|||
|
x = x % p;
|
|||
|
while (y > 0) {
|
|||
|
if (y & 1)
|
|||
|
res = (res*x) % p;
|
|||
|
|
|||
|
// y must be even now
|
|||
|
y = y>>1;
|
|||
|
x = (x*x) % p;
|
|||
|
}
|
|||
|
return res;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
时间复杂度:O(Log y)。
|