From 15187bb0108164a6b84bdc898a8137b594ddce40 Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Sat, 29 Aug 2020 12:54:42 +0530 Subject: [PATCH 1/4] Add files via upload --- maths/ugly_numbers.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 maths/ugly_numbers.py diff --git a/maths/ugly_numbers.py b/maths/ugly_numbers.py new file mode 100644 index 000000000000..d3b9af2cb8b9 --- /dev/null +++ b/maths/ugly_numbers.py @@ -0,0 +1,49 @@ +""" +Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence +1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the first 11 ugly numbers. By convention, +1 is included. +Given an integer n, we have to find the nth ugly number. + +For more details, refer this article +https://www.geeksforgeeks.org/ugly-numbers/ +""" + + +def ugly_numbers(n: int) -> int: + """ + Returns the nth ugly number. + >>> ugly_numbers(100) + 1536 + >>> ugly_numbers(1) + 1 + >>> ugly_numbers(20) + 36 + """ + ugly_nums = [0] * (n) + ugly_nums[0] = 1 + + i2, i3, i5 = 0, 0, 0 + next_2 = ugly_nums[i2] * 2 + next_3 = ugly_nums[i3] * 3 + next_5 = ugly_nums[i5] * 5 + + for i in range(1, n): + next_num = min(next_2, next_3, next_5) + ugly_nums[i] = next_num + if next_num == next_2: + i2 += 1 + next_2 = ugly_nums[i2] * 2 + if next_num == next_3: + i3 += 1 + next_3 = ugly_nums[i3] * 3 + if next_num == next_5: + i5 += 1 + next_5 = ugly_nums[i5] * 5 + return ugly_nums[-1] + + +if __name__ == "__main__": + from doctest import testmod + + testmod(verbose=True) + print(f"{ugly_numbers(200)}") From 45baa0663d33c74e0af236d4d09360c89a8ecc4c Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Sat, 29 Aug 2020 12:55:33 +0530 Subject: [PATCH 2/4] Update ugly_numbers.py --- maths/ugly_numbers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/ugly_numbers.py b/maths/ugly_numbers.py index d3b9af2cb8b9..f8f84f022f6c 100644 --- a/maths/ugly_numbers.py +++ b/maths/ugly_numbers.py @@ -46,4 +46,4 @@ def ugly_numbers(n: int) -> int: from doctest import testmod testmod(verbose=True) - print(f"{ugly_numbers(200)}") + print(f"{ugly_numbers(200) = }") From 6d14e2480c9978b85e3e17600d99098c7adb14f4 Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Sat, 29 Aug 2020 14:03:11 +0530 Subject: [PATCH 3/4] Update ugly_numbers.py --- maths/ugly_numbers.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/maths/ugly_numbers.py b/maths/ugly_numbers.py index f8f84f022f6c..d3dbbc1115d0 100644 --- a/maths/ugly_numbers.py +++ b/maths/ugly_numbers.py @@ -19,8 +19,7 @@ def ugly_numbers(n: int) -> int: >>> ugly_numbers(20) 36 """ - ugly_nums = [0] * (n) - ugly_nums[0] = 1 + ugly_nums = [1] i2, i3, i5 = 0, 0, 0 next_2 = ugly_nums[i2] * 2 @@ -29,7 +28,7 @@ def ugly_numbers(n: int) -> int: for i in range(1, n): next_num = min(next_2, next_3, next_5) - ugly_nums[i] = next_num + ugly_nums.append(next_num) if next_num == next_2: i2 += 1 next_2 = ugly_nums[i2] * 2 From 0245d447197e1b7e3f0203dc6b30bbfae148cf28 Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Sat, 29 Aug 2020 17:18:32 +0530 Subject: [PATCH 4/4] Update ugly_numbers.py --- maths/ugly_numbers.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/maths/ugly_numbers.py b/maths/ugly_numbers.py index d3dbbc1115d0..4451a68cdaad 100644 --- a/maths/ugly_numbers.py +++ b/maths/ugly_numbers.py @@ -14,10 +14,16 @@ def ugly_numbers(n: int) -> int: Returns the nth ugly number. >>> ugly_numbers(100) 1536 - >>> ugly_numbers(1) + >>> ugly_numbers(0) 1 >>> ugly_numbers(20) 36 + >>> ugly_numbers(-5) + 1 + >>> ugly_numbers(-5.5) + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer """ ugly_nums = [1]