leetcode/
powx_n.rs

1//! # 50. Pow(x, n)
2//!
3//! 难度 中等
4//!
5//! 实现 pow(x, n) ,即计算 x 的 n 次幂函数。
6//!
7//! ## 示例 1:
8//!
9//! ```text
10//! 输入: 2.00000, 10
11//! 输出: 1024.00000
12//! ```
13//!
14//! ## 示例 2:
15//!
16//! ```text
17//! 输入: 2.10000, 3
18//! 输出: 9.26100
19//! ```
20//!
21//! ## 示例 3:
22//!
23//! ```text
24//! 输入: 2.00000, -2
25//! 输出: 0.25000
26//! 解释: 2-2 = 1/22 = 1/4 = 0.25
27//! ```
28//!
29//! ## 说明:
30//!
31//! - `-100.0 < x < 100.0`
32//! - *n* 是 32 位有符号整数,其数值范围是 `[−231, 231 − 1]` 。
33//!
34//! See [leetcode](https://leetcode-cn.com/problems/powx-n/)
35
36pub struct Solution;
37
38impl Solution {
39
40    /// 把 n 考虑成 2 进制表示,例如 100_1011 = 10_0000 + 1000 + 10 + 1
41    /// 所以,x 的 n 次幂可以拆分成每一位 1 对应的数的次幂
42    pub fn my_pow(x: f64, n: i32) -> f64 {
43        if n >= 0 {
44            do_pow(x, n as u32)
45        } else {
46            1.0 / do_pow(x, -n as u32)
47        }
48    }
49}
50
51fn do_pow(mut x: f64, mut n: u32) -> f64 {
52    let mut ans = 1.0;
53
54    while n > 0 {
55        if n & 1 == 1 {
56            ans *= x;
57        }
58        x *= x;
59        n >>= 1;
60    }
61    ans
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn test() {
70        let cases = vec![
71            (2.0_f64, 10),
72            (2.1, 3),
73            (2.0, -2),
74            (0.0, 0),
75        ];
76
77        for (x, n) in cases {
78            assert_eq!(x.powi(n), Solution::my_pow(x, n));
79        }
80    }
81}