From c279806a3601e8ae096b4012b552743fac9ad28a Mon Sep 17 00:00:00 2001 From: tom4649 Date: Sun, 19 Jul 2026 08:31:37 +0900 Subject: [PATCH] step1,2 --- 0202.Happy-Number/memo.md | 25 +++++++++++++++++++++++++ 0202.Happy-Number/step1_seen.py | 16 ++++++++++++++++ 0202.Happy-Number/step2_floyd.py | 19 +++++++++++++++++++ 0202.Happy-Number/step2_one_or_four.py | 12 ++++++++++++ 0202.Happy-Number/step2_seen_revised.py | 16 ++++++++++++++++ 5 files changed, 88 insertions(+) create mode 100644 0202.Happy-Number/memo.md create mode 100644 0202.Happy-Number/step1_seen.py create mode 100644 0202.Happy-Number/step2_floyd.py create mode 100644 0202.Happy-Number/step2_one_or_four.py create mode 100644 0202.Happy-Number/step2_seen_revised.py diff --git a/0202.Happy-Number/memo.md b/0202.Happy-Number/memo.md new file mode 100644 index 0000000..196a9ba --- /dev/null +++ b/0202.Happy-Number/memo.md @@ -0,0 +1,25 @@ +# 202. Happy Number + +## step1 +Falseのときに循環が生じることへの確証がないが、これを仮定して実装を行う。6mぐらい。 + +## 他の人のコードなど + +https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC%E6%95%B0 + +確かに循環が生じるようだ。 + +> ハッピー列は1か4に到達する + +https://www.reddit.com/r/learnmath/comments/nuyqf7/how_to_prove_that_happy_numbers_form_a_cycle/?tl=ja + +循環の証明。桁数 n >= 5 の場合に 10^(n-1) > 81nなので5桁以上になったあと、次の数字は元の数より小さくなる。 +4 桁の最大値である 9999 の二乗和は243なので、どんなに大きな数になってもいずれ1以上243以下の値となる。 +あとは鳩の巣原理で循環があることが示せる。 + +https://github.com/hhhirokunnn/studyAlgo/pull/2#pullrequestreview-2056729822 + +- https://docs.python.org/3/library/functions.html#divmod +- Floyds Cycle-Finding + +「循環」が出てきたらFloyds Cycle-Findingが選択肢に入るようにしたい diff --git a/0202.Happy-Number/step1_seen.py b/0202.Happy-Number/step1_seen.py new file mode 100644 index 0000000..fe5aa3a --- /dev/null +++ b/0202.Happy-Number/step1_seen.py @@ -0,0 +1,16 @@ +class Solution: + def isHappy(self, n: int) -> bool: + seen = set() + number = n + + while number not in seen: + if number == 1: + return True + seen.add(number) + next_number = 0 + while number > 0: + next_number += (number % 10) ** 2 + number //= 10 + number = next_number + + return False diff --git a/0202.Happy-Number/step2_floyd.py b/0202.Happy-Number/step2_floyd.py new file mode 100644 index 0000000..fdc17ca --- /dev/null +++ b/0202.Happy-Number/step2_floyd.py @@ -0,0 +1,19 @@ +class Solution: + def isHappy(self, n: int) -> bool: + if n == 1: + return True + + def get_next(number): + next_number = 0 + while number > 0: + number, digit = divmod(number, 10) + next_number += digit ** 2 + return next_number + + slow = n + fast = get_next(n) + while fast != 1 and slow != fast: + slow = get_next(slow) + fast = get_next(get_next(fast)) + + return fast == 1 diff --git a/0202.Happy-Number/step2_one_or_four.py b/0202.Happy-Number/step2_one_or_four.py new file mode 100644 index 0000000..0f9eb9b --- /dev/null +++ b/0202.Happy-Number/step2_one_or_four.py @@ -0,0 +1,12 @@ +class Solution: + def isHappy(self, n: int) -> bool: + number = n + + while number != 1 and number != 4: + next_number = 0 + while number > 0: + number, digit = divmod(number, 10) + next_number += digit ** 2 + number = next_number + + return number == 1 diff --git a/0202.Happy-Number/step2_seen_revised.py b/0202.Happy-Number/step2_seen_revised.py new file mode 100644 index 0000000..d2eabe2 --- /dev/null +++ b/0202.Happy-Number/step2_seen_revised.py @@ -0,0 +1,16 @@ +class Solution: + def isHappy(self, n: int) -> bool: + seen = set() + number = n + + while number not in seen: + if number == 1: + return True + seen.add(number) + next_number = 0 + while number > 0: + number, digit = divmod(number, 10) + next_number += digit ** 2 + number = next_number + + return False