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}