Skip to content

Commit dc4f603

Browse files
MaximSmolskiygithub-actionspre-commit-ci[bot]
authored
Add Project Euler problem 187 solution 1 (#8182)
Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 5ce63b5 commit dc4f603

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,8 @@
990990
* [Sol1](project_euler/problem_174/sol1.py)
991991
* Problem 180
992992
* [Sol1](project_euler/problem_180/sol1.py)
993+
* Problem 187
994+
* [Sol1](project_euler/problem_187/sol1.py)
993995
* Problem 188
994996
* [Sol1](project_euler/problem_188/sol1.py)
995997
* Problem 191

project_euler/problem_187/__init__.py

Whitespace-only changes.

project_euler/problem_187/sol1.py

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"""
2+
Project Euler Problem 187: https://projecteuler.net/problem=187
3+
4+
A composite is a number containing at least two prime factors.
5+
For example, 15 = 3 x 5; 9 = 3 x 3; 12 = 2 x 2 x 3.
6+
7+
There are ten composites below thirty containing precisely two,
8+
not necessarily distinct, prime factors: 4, 6, 9, 10, 14, 15, 21, 22, 25, 26.
9+
10+
How many composite integers, n < 10^8, have precisely two,
11+
not necessarily distinct, prime factors?
12+
"""
13+
14+
from math import isqrt
15+
16+
17+
def calculate_prime_numbers(max_number: int) -> list[int]:
18+
"""
19+
Returns prime numbers below max_number
20+
21+
>>> calculate_prime_numbers(10)
22+
[2, 3, 5, 7]
23+
"""
24+
25+
is_prime = [True] * max_number
26+
for i in range(2, isqrt(max_number - 1) + 1):
27+
if is_prime[i]:
28+
for j in range(i**2, max_number, i):
29+
is_prime[j] = False
30+
31+
return [i for i in range(2, max_number) if is_prime[i]]
32+
33+
34+
def solution(max_number: int = 10**8) -> int:
35+
"""
36+
Returns the number of composite integers below max_number have precisely two,
37+
not necessarily distinct, prime factors
38+
39+
>>> solution(30)
40+
10
41+
"""
42+
43+
prime_numbers = calculate_prime_numbers(max_number // 2)
44+
45+
semiprimes_count = 0
46+
left = 0
47+
right = len(prime_numbers) - 1
48+
while left <= right:
49+
while prime_numbers[left] * prime_numbers[right] >= max_number:
50+
right -= 1
51+
semiprimes_count += right - left + 1
52+
left += 1
53+
54+
return semiprimes_count
55+
56+
57+
if __name__ == "__main__":
58+
print(f"{solution() = }")

0 commit comments

Comments
 (0)