Skip to content

Commit f2f0425

Browse files
authored
Created ugly_numbers.py in Python/maths (TheAlgorithms#2366)
* Add files via upload * Update ugly_numbers.py * Update ugly_numbers.py * Update ugly_numbers.py
1 parent 1f5134b commit f2f0425

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

maths/ugly_numbers.py

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
3+
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the first 11 ugly numbers. By convention,
4+
1 is included.
5+
Given an integer n, we have to find the nth ugly number.
6+
7+
For more details, refer this article
8+
https://www.geeksforgeeks.org/ugly-numbers/
9+
"""
10+
11+
12+
def ugly_numbers(n: int) -> int:
13+
"""
14+
Returns the nth ugly number.
15+
>>> ugly_numbers(100)
16+
1536
17+
>>> ugly_numbers(0)
18+
1
19+
>>> ugly_numbers(20)
20+
36
21+
>>> ugly_numbers(-5)
22+
1
23+
>>> ugly_numbers(-5.5)
24+
Traceback (most recent call last):
25+
...
26+
TypeError: 'float' object cannot be interpreted as an integer
27+
"""
28+
ugly_nums = [1]
29+
30+
i2, i3, i5 = 0, 0, 0
31+
next_2 = ugly_nums[i2] * 2
32+
next_3 = ugly_nums[i3] * 3
33+
next_5 = ugly_nums[i5] * 5
34+
35+
for i in range(1, n):
36+
next_num = min(next_2, next_3, next_5)
37+
ugly_nums.append(next_num)
38+
if next_num == next_2:
39+
i2 += 1
40+
next_2 = ugly_nums[i2] * 2
41+
if next_num == next_3:
42+
i3 += 1
43+
next_3 = ugly_nums[i3] * 3
44+
if next_num == next_5:
45+
i5 += 1
46+
next_5 = ugly_nums[i5] * 5
47+
return ugly_nums[-1]
48+
49+
50+
if __name__ == "__main__":
51+
from doctest import testmod
52+
53+
testmod(verbose=True)
54+
print(f"{ugly_numbers(200) = }")

0 commit comments

Comments
 (0)