Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions maths/persistence.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
def multiplicative_persistence(num: int) -> int:
"""
Return the persistence of a given number.

https://en.wikipedia.org/wiki/Persistence_of_a_number

>>> multiplicative_persistence(217)
2
>>> multiplicative_persistence(-1)
Traceback (most recent call last):
...
ValueError: multiplicative_persistence() does not accept negative values
>>> multiplicative_persistence("long number")
Traceback (most recent call last):
...
ValueError: multiplicative_persistence() only accepts integral values
"""

if not isinstance(num, int):
raise ValueError("multiplicative_persistence() only accepts integral values")
if num < 0:
raise ValueError("multiplicative_persistence() does not accept negative values")

steps = 0
num_string = str(num)

while len(num_string) != 1:
numbers = [int(i) for i in num_string]

total = 1
for i in range(0, len(numbers)):
total *= numbers[i]

num_string = str(total)

steps += 1
return steps


def additive_persistence(num: int) -> int:
"""
Return the persistence of a given number.

https://en.wikipedia.org/wiki/Persistence_of_a_number

>>> additive_persistence(199)
3
>>> additive_persistence(-1)
Traceback (most recent call last):
...
ValueError: additive_persistence() does not accept negative values
>>> additive_persistence("long number")
Traceback (most recent call last):
...
ValueError: additive_persistence() only accepts integral values
"""

if not isinstance(num, int):
raise ValueError("additive_persistence() only accepts integral values")
if num < 0:
raise ValueError("additive_persistence() does not accept negative values")

steps = 0
num_string = str(num)

while len(num_string) != 1:
numbers = [int(i) for i in num_string]

total = 0
for i in range(0, len(numbers)):
total += numbers[i]

num_string = str(total)

steps += 1
return steps


if __name__ == "__main__":
import doctest

doctest.testmod()