Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions 0202.Happy-Number/memo.md
Original file line number Diff line number Diff line change
@@ -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が選択肢に入るようにしたい
16 changes: 16 additions & 0 deletions 0202.Happy-Number/step1_seen.py
Original file line number Diff line number Diff line change
@@ -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
19 changes: 19 additions & 0 deletions 0202.Happy-Number/step2_floyd.py
Original file line number Diff line number Diff line change
@@ -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
12 changes: 12 additions & 0 deletions 0202.Happy-Number/step2_one_or_four.py
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions 0202.Happy-Number/step2_seen_revised.py
Original file line number Diff line number Diff line change
@@ -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