-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
Created harshad_numbers.py #9023
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
c319119
e10bc54
deec6d4
fcb5639
44eb286
ad09b82
3d00dad
4d1a89c
21a703d
1584436
7b9809c
03d0296
2974289
6ebaf25
04f1e2b
6b0243c
385c294
edf0036
8dbfa37
d4d9c7c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
""" | ||
A Harshad number is divisible by the sum of its digits in any base n. | ||
Reference: https://en.wikipedia.org/wiki/Harshad_number | ||
""" | ||
|
||
|
||
def int_to_base(number, base_of_interest): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: |
||
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||
result = "" | ||
|
||
while number > 0: | ||
davidekong marked this conversation as resolved.
Show resolved
Hide resolved
|
||
number, remainder = divmod(number, base_of_interest) | ||
result = digits[remainder] + result | ||
|
||
if result == "": | ||
result = "0" | ||
|
||
return result | ||
|
||
|
||
def sum_of_digits(num: int, base_of_interest: int): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: |
||
""" | ||
Calculate the sum of digit values in a positive integer | ||
converted to the given 'base_of_interest'. | ||
Where 'base_of_interest' ranges from 2 to 36. | ||
|
||
Examples: | ||
>>> sum_of_digits(103, 12) | ||
'13' | ||
>>> sum_of_digits(1275, 4) | ||
'30' | ||
>>> sum_of_digits(6645, 2) | ||
'1001' | ||
>>> # bases beyond 36 and below 2 will error | ||
>>> sum_of_digits(543, 1) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
>>> sum_of_digits(543, 37) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
""" | ||
|
||
if (base_of_interest > 36) or (base_of_interest < 2): | ||
raise ValueError("'base_of_interest' must be between 36 and 2 inclusive") | ||
|
||
num = int_to_base(num, base_of_interest) | ||
res = 0 | ||
for char in num: | ||
res += int(char, base_of_interest) | ||
res = int_to_base(res, base_of_interest) | ||
return res | ||
|
||
|
||
def all_harshad_numbers(num: int, base_of_interest: int): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: |
||
""" | ||
Finds all Harshad numbers smaller than num in base 'base_of_interest'. | ||
Where 'base_of_interest' ranges from 2 to 36. | ||
|
||
Examples: | ||
>>> all_harshad_numbers(15, 2) | ||
(7, ['1', '10', '100', '110', '1000', '1010', '1100']) | ||
>>> all_harshad_numbers(12, 34) | ||
(11, ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B']) | ||
>>> all_harshad_numbers(12, 4) | ||
(7, ['1', '2', '3', '10', '12', '20', '21']) | ||
>>> # bases beyond 36 and below 2 will error | ||
>>> all_harshad_numbers(234, 37) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
>>> all_harshad_numbers(234, 1) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
""" | ||
|
||
if (base_of_interest > 36) or (base_of_interest < 2): | ||
raise ValueError("'base_of_interest' must be between 36 and 2 inclusive") | ||
|
||
result = 0 | ||
numbers = [] | ||
if num >= 0: | ||
for i in range(1, num): | ||
y = sum_of_digits(i, base_of_interest) | ||
if i % int(y, base_of_interest) == 0: | ||
result += 1 | ||
numbers.append(int_to_base(i, base_of_interest)) | ||
|
||
return result, numbers | ||
|
||
|
||
def is_harshad_number(num: int, base_of_interest: int): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: |
||
""" | ||
Determines whether n in base 'base_of_interest' is a harshad number. | ||
Where 'base_of_interest' ranges from 2 to 36. | ||
|
||
Examples: | ||
>>> is_harshad_number(18, 10) | ||
True | ||
>>> is_harshad_number(21, 10) | ||
True | ||
>>> is_harshad_number(-21, 5) | ||
False | ||
>>> # bases beyond 36 and below 2 will error | ||
>>> is_harshad_number(45, 37) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
>>> is_harshad_number(45, 1) | ||
Traceback (most recent call last): | ||
... | ||
ValueError: 'base_of_interest' must be between 36 and 2 inclusive | ||
""" | ||
|
||
if (base_of_interest > 36) or (base_of_interest < 2): | ||
raise ValueError("'base_of_interest' must be between 36 and 2 inclusive") | ||
|
||
if num >= 0: | ||
n = int_to_base(num, base_of_interest) | ||
d = sum_of_digits(num, base_of_interest) | ||
if int(n, base_of_interest) % int(d, base_of_interest) == 0: | ||
return True | ||
|
||
return False | ||
davidekong marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
if __name__ == "__main__": | ||
import doctest | ||
|
||
doctest.testmod() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpicks: