-
Notifications
You must be signed in to change notification settings - Fork 2
/
IntegerPower.ts
57 lines (51 loc) · 1.4 KB
/
IntegerPower.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
export default class IntegerPower {
/**
* 数值的整数次方
* @param base 底数
* @param exponent 指数
*/
public power(base: number, exponent: number): number | string {
// 求出指数对绝对值
const absExponent = Math.abs(exponent);
// 程序会出错
if (base === 0 && exponent < 0) {
return "参数错误: 0的负次方不能进行计算";
}
// 当底数和指数都为0时,在数学上是没意义的
if (base === 0 && exponent === 0) {
return 0;
}
let result = this.powerWithExponent(base, absExponent);
// 指数小于0, 对计算出的结果求倒数
if (exponent < 0) {
result = 1 / result;
}
return result;
}
/**
* 求底数的指数次方
* @param base 底数
* @param exponent 指数
*/
private powerWithExponent(base: number, exponent: number): number {
// 递归终止条件
if (exponent === 0) {
// 非0数的0次方值为1
return 1;
}
if (exponent === 1) {
// 任意数的0次方为其本身
return base;
}
// 递归对指数/2,计算结果
// 用右移运算符代替除以2运算
let result =
this.powerWithExponent(base, exponent >> 1) *
this.powerWithExponent(base, exponent >> 1);
// 指数为奇数时,result就为result乘以底数
if (exponent % 2 === 1) {
result *= base;
}
return result;
}
}