From 2966a0aec83d3223b1f562f60f62f22f253232a8 Mon Sep 17 00:00:00 2001 From: tokuhirat <54652919+tokuhirat@users.noreply.github.com> Date: Tue, 22 Jul 2025 23:12:00 +0900 Subject: [PATCH] Create 50. Pow(x, n).md --- 50. Pow(x, n)/50. Pow(x, n).md | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 50. Pow(x, n)/50. Pow(x, n).md diff --git a/50. Pow(x, n)/50. Pow(x, n).md b/50. Pow(x, n)/50. Pow(x, n).md new file mode 100644 index 0000000..487f47d --- /dev/null +++ b/50. Pow(x, n)/50. Pow(x, n).md @@ -0,0 +1,93 @@ +# 50. Pow(x, n) +## STEP1 +- 何も見ずに解いてみる +- 繰り返し二乗法を書く。 +- 累乗の部分の書き方次第で OverflowError になる。なぜかは不明。 + +```python +class Solution: + def myPow(self, x: float, n: int) -> float: + if n < 0: + return 1 / self.myPow(x, -n) + + result = 1.0 + pow = x + while n > 0: + if n % 2 == 1: + result *= pow + pow *= pow + # pow **= 2 このようにすると OverflowError + n //= 2 + return result +``` + +## STEP2 +### プルリクやドキュメントを参照 +- https://docs.python.org/3/library/functions.html#pow + - pow 組み込み関数にあるので変数名は変えた方が良さそう。 +- https://github.com/olsen-blue/Arai60/pull/45/files + - 再帰でも書ける。 + +再帰で書いてみる。 +```python +class Solution: + def myPow(self, x: float, n: int) -> float: + if n == 0: + return 1.0 + if n < 0: + return 1.0 / self.myPow(x, -n) + + if n % 2 == 1: + return x * self.myPow(x * x, n // 2) + else: + return self.myPow(x * x, n // 2) +``` +- // で割っているので (n - 1) // 2 とは書かなくて良いかなと思った。 + +- https://github.com/TORUS0818/leetcode/pull/47#discussion_r2038337006 + - これ読みやすい。n が固定されていて、bit, base という変数名も明確。 + +これを踏まえて書き直し。 +```python +class Solution: + def myPow(self, x: float, n: int) -> float: + if n < 0: + return 1.0 / self.myPow(x, -n) + + result = 1.0 + bit = 1 + base = x + while bit <= n: + if n & bit: + result *= base + base *= base + bit <<= 1 + return result +``` + +- n が負の数の場合 n を正にして再度関数を呼ぶパターンはそんなに読みにくさを感じない。明示的に変換を書いている分数学的に同値な変形がわかりやすいのでは。まあ同一関数内で n, x ともに上書きするのでも全然良いとは思う。 + +- https://github.com/hroc135/leetcode/pull/43/files + - 上記PRに書いてある IEEE 754 に関する部分を読んだ。NaN の表現などについては知らなかった。 + - https://www.geeksforgeeks.org/computer-organization-architecture/ieee-standard-754-floating-point-numbers/ + +## STEP3 +### 3回ミスなく書く +```python +class Solution: + def myPow(self, x: float, n: int) -> float: + if n < 0: + return 1.0 / self.myPow(x, -n) + + result = 1.0 + base = x + bit = 1 + while bit <= n: + if bit & n: + result *= base + base *= base + bit <<= 1 + return result +``` + +1分,1分,1分で3回Accept