From 4558e59c8aae9bdbe511ccf020e86da08585d883 Mon Sep 17 00:00:00 2001 From: jowerman Date: Thu, 7 Nov 2019 09:31:34 +0800 Subject: [PATCH 1/4] Add sol3 for project_euler proble_03 --- project_euler/problem_03/sol3.py | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 project_euler/problem_03/sol3.py diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py new file mode 100644 index 000000000000..9893c704ea5f --- /dev/null +++ b/project_euler/problem_03/sol3.py @@ -0,0 +1,63 @@ +""" +Problem: +The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor +of a given number N? + +e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. +""" + + +def solution(n): + """Returns the largest prime factor of a given number n. + + >>> solution(13195) + 29 + >>> solution(10) + 5 + >>> solution(17) + 17 + >>> solution(3.4) + 3 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or passive of cast to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or passive of cast to int. + """ + try: + n = int(n) + except (TypeError, ValueError) as e: + raise TypeError("Parameter n must be int or passive of cast to int.") + if n <= 0: + raise ValueError("Parameter n must be greater or equal to one.") + prime = 1 + i = 2 + ans = 0 + if n==2: + return 2 + while n > 2: + while n%i != 0: + i += 1 + ans = i + while(n%i ==0): + n = n/i + i += 1 + + return int(ans) + + +if __name__ == "__main__": + #print(solution(int(input().strip()))) + import doctest + doctest.testmod() From 63509849f08d842e1ffdf48d43d98e753523a90b Mon Sep 17 00:00:00 2001 From: jwmneu Date: Thu, 7 Nov 2019 16:13:28 +0800 Subject: [PATCH 2/4] Update sol3.py add type hint remove unused variable --- project_euler/problem_03/sol3.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 9893c704ea5f..34329c26e621 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -7,7 +7,7 @@ """ -def solution(n): +def solution(n:int)->int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -41,7 +41,6 @@ def solution(n): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - prime = 1 i = 2 ans = 0 if n==2: From f551ee6f944c4f6cd2ef45d23609b40ba717f97e Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Thu, 7 Nov 2019 09:37:06 +0100 Subject: [PATCH 3/4] Format code with psf/black --- project_euler/problem_03/sol3.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 34329c26e621..5fe45df59984 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -7,7 +7,7 @@ """ -def solution(n:int)->int: +def solution(n: int) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -37,26 +37,27 @@ def solution(n:int)->int: """ try: n = int(n) - except (TypeError, ValueError) as e: + except (TypeError, ValueError): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") i = 2 ans = 0 - if n==2: + if n == 2: return 2 while n > 2: - while n%i != 0: + while n % i != 0: i += 1 ans = i - while(n%i ==0): - n = n/i + while n % i == 0: + n = n / i i += 1 return int(ans) if __name__ == "__main__": - #print(solution(int(input().strip()))) + # print(solution(int(input().strip()))) import doctest + doctest.testmod() From 050ae4863b00f025832b46163320f17537d8e147 Mon Sep 17 00:00:00 2001 From: jowerman Date: Sun, 10 Nov 2019 12:22:03 +0800 Subject: [PATCH 4/4] add sol3 to project_euler/problem_08, modify the stepsize of the loop,will be faster than sol1 --- project_euler/problem_08/sol3.py | 83 ++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 project_euler/problem_08/sol3.py diff --git a/project_euler/problem_08/sol3.py b/project_euler/problem_08/sol3.py new file mode 100644 index 000000000000..fe9901742201 --- /dev/null +++ b/project_euler/problem_08/sol3.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +""" +The four adjacent digits in the 1000-digit number that have the greatest +product are 9 × 9 × 8 × 9 = 5832. + +73167176531330624919225119674426574742355349194934 +96983520312774506326239578318016984801869478851843 +85861560789112949495459501737958331952853208805511 +12540698747158523863050715693290963295227443043557 +66896648950445244523161731856403098711121722383113 +62229893423380308135336276614282806444486645238749 +30358907296290491560440772390713810515859307960866 +70172427121883998797908792274921901699720888093776 +65727333001053367881220235421809751254540594752243 +52584907711670556013604839586446706324415722155397 +53697817977846174064955149290862569321978468622482 +83972241375657056057490261407972968652414535100474 +82166370484403199890008895243450658541227588666881 +16427171479924442928230863465674813919123162824586 +17866458359124566529476545682848912883142607690042 +24219022671055626321111109370544217506941658960408 +07198403850962455444362981230987879927244284909188 +84580156166097919133875499200524063689912560717606 +05886116467109405077541002256983155200055935729725 +71636269561882670428252483600823257530420752963450 + +Find the thirteen adjacent digits in the 1000-digit number that have the +greatest product. What is the value of this product? +""" +import sys + +N = """73167176531330624919225119674426574742355349194934\ +96983520312774506326239578318016984801869478851843\ +85861560789112949495459501737958331952853208805511\ +12540698747158523863050715693290963295227443043557\ +66896648950445244523161731856403098711121722383113\ +62229893423380308135336276614282806444486645238749\ +30358907296290491560440772390713810515859307960866\ +70172427121883998797908792274921901699720888093776\ +65727333001053367881220235421809751254540594752243\ +52584907711670556013604839586446706324415722155397\ +53697817977846174064955149290862569321978468622482\ +83972241375657056057490261407972968652414535100474\ +82166370484403199890008895243450658541227588666881\ +16427171479924442928230863465674813919123162824586\ +17866458359124566529476545682848912883142607690042\ +24219022671055626321111109370544217506941658960408\ +07198403850962455444362981230987879927244284909188\ +84580156166097919133875499200524063689912560717606\ +05886116467109405077541002256983155200055935729725\ +71636269561882670428252483600823257530420752963450""" + + +def streval(s: str) -> int: + ret = 1 + for it in s: + ret *= int(it) + return ret + + +def solution(n: str) -> int: + """Find the thirteen adjacent digits in the 1000-digit number n that have + the greatest product and returns it. + + >>> solution(N) + 23514624000 + """ + LargestProduct = -sys.maxsize - 1 + substr = n[:13] + cur_index = 13 + while cur_index < len(n) - 13: + if int(n[cur_index]) >= int(substr[0]): + substr = substr[1:] + n[cur_index] + cur_index += 1 + else: + LargestProduct = max(LargestProduct, streval(substr)) + substr = n[cur_index : cur_index + 13] + cur_index += 13 + return LargestProduct + + +if __name__ == "__main__": + print(solution(N))