mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Project Euler 206 Solution (#3829)
* Readd Project Euler 206 solution for issue #2695, dupe of pull request #3042 * Add PE 206 to directory * updating DIRECTORY.md Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
This commit is contained in:
parent
786b32431c
commit
61cb921d87
|
@ -725,6 +725,8 @@
|
|||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_174/sol1.py)
|
||||
* Problem 191
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_191/sol1.py)
|
||||
* Problem 206
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_206/sol1.py)
|
||||
* Problem 207
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_207/sol1.py)
|
||||
* Problem 234
|
||||
|
|
0
project_euler/problem_206/__init__.py
Normal file
0
project_euler/problem_206/__init__.py
Normal file
74
project_euler/problem_206/sol1.py
Normal file
74
project_euler/problem_206/sol1.py
Normal file
|
@ -0,0 +1,74 @@
|
|||
"""
|
||||
Project Euler Problem 206: https://projecteuler.net/problem=206
|
||||
|
||||
Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0,
|
||||
where each “_” is a single digit.
|
||||
|
||||
-----
|
||||
|
||||
Instead of computing every single permutation of that number and going
|
||||
through a 10^9 search space, we can narrow it down considerably.
|
||||
|
||||
If the square ends in a 0, then the square root must also end in a 0. Thus,
|
||||
the last missing digit must be 0 and the square root is a multiple of 10.
|
||||
We can narrow the search space down to the first 8 digits and multiply the
|
||||
result of that by 10 at the end.
|
||||
|
||||
Now the last digit is a 9, which can only happen if the square root ends
|
||||
in a 3 or 7. From this point, we can try one of two different methods to find
|
||||
the answer:
|
||||
|
||||
1. Start at the lowest possible base number whose square would be in the
|
||||
format, and count up. The base we would start at is 101010103, whose square is
|
||||
the closest number to 10203040506070809. Alternate counting up by 4 and 6 so
|
||||
the last digit of the base is always a 3 or 7.
|
||||
|
||||
2. Start at the highest possible base number whose square would be in the
|
||||
format, and count down. That base would be 138902663, whose square is the
|
||||
closest number to 1929394959697989. Alternate counting down by 6 and 4 so the
|
||||
last digit of the base is always a 3 or 7.
|
||||
|
||||
The solution does option 2 because the answer happens to be much closer to the
|
||||
starting point.
|
||||
"""
|
||||
|
||||
|
||||
def is_square_form(num: int) -> bool:
|
||||
"""
|
||||
Determines if num is in the form 1_2_3_4_5_6_7_8_9
|
||||
|
||||
>>> is_square_form(1)
|
||||
False
|
||||
>>> is_square_form(112233445566778899)
|
||||
True
|
||||
>>> is_square_form(123456789012345678)
|
||||
False
|
||||
"""
|
||||
digit = 9
|
||||
|
||||
while num > 0:
|
||||
if num % 10 != digit:
|
||||
return False
|
||||
num //= 100
|
||||
digit -= 1
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def solution() -> int:
|
||||
"""
|
||||
Returns the first integer whose square is of the form 1_2_3_4_5_6_7_8_9_0
|
||||
"""
|
||||
num = 138902663
|
||||
|
||||
while not is_square_form(num * num):
|
||||
if num % 10 == 3:
|
||||
num -= 6 # (3 - 6) % 10 = 7
|
||||
else:
|
||||
num -= 4 # (7 - 4) % 10 = 3
|
||||
|
||||
return num * 10
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"{solution() = }")
|
Loading…
Reference in New Issue
Block a user