From 2171cad18e78ff4d4d8f86a71c0c43b703301142 Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Thu, 18 Mar 2021 17:00:54 -0700 Subject: [PATCH] Mathematical: Digital Root approach --- data_structures/arrays/add_digits.rb | 6 ++-- maths/add_digits.rb | 41 ++++++++++++++++++++++++++++ maths/sum_of_digits.rb | 19 ------------- 3 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 maths/add_digits.rb diff --git a/data_structures/arrays/add_digits.rb b/data_structures/arrays/add_digits.rb index 731236d..2662484 100644 --- a/data_structures/arrays/add_digits.rb +++ b/data_structures/arrays/add_digits.rb @@ -33,10 +33,10 @@ def add_digits(num) add_digits(sum) end -# puts(add_digits(38)) +puts(add_digits(38)) # # => 2 -# puts(add_digits(284)) +puts(add_digits(284)) # # => 5 # @@ -58,4 +58,4 @@ puts(add_digits(38)) # => 2 puts(add_digits(284)) -# => 5 \ No newline at end of file +# => 5 diff --git a/maths/add_digits.rb b/maths/add_digits.rb new file mode 100644 index 0000000..3dc3e71 --- /dev/null +++ b/maths/add_digits.rb @@ -0,0 +1,41 @@ +# Challenge name: Add Digits +# +# Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. +# +# Example: +# +# Input: 38 +# Output: 2 +# Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2. +# Since 2 has only one digit, return it. +# +# Follow up: +# Could you do it without any loop/recursion in O(1) runtime? +# @param {Integer} num +# @return {Integer} + +# +# Approach: Mathematical: Digital Root +# https://en.wikipedia.org/wiki/Digital_root +# + +# +# Complexity Analysis +# +# Time Complexity: O(1). +# Space Complexity: O(1). + +def add_digits(num) + if num == 0 + return 0 + elsif num % 9 == 0 + return 9 + end + return num % 9 +end + +puts(add_digits(38)) +# # => 2 + +puts(add_digits(284)) +# # => 5 diff --git a/maths/sum_of_digits.rb b/maths/sum_of_digits.rb index a19b197..e69de29 100644 --- a/maths/sum_of_digits.rb +++ b/maths/sum_of_digits.rb @@ -1,19 +0,0 @@ -# Given a number, find sum of its digits. - -def digits_sum(n) - a = 0 - sum = 0 - until n.zero? - a = n % 10 - sum += a - n /= 10 - end - sum -end - -puts 'Sum of digits of 3456 is ' + digits_sum(3456).to_s -# Sum of digits of 3456 is 18 -puts 'Sum of digits of 1234 is ' + digits_sum(1234).to_s -# Sum of digits of 1234 is 10 -puts 'Sum of digits of 9251321 is ' + digits_sum(9_251_321).to_s -# Sum of digits of 9251321 is 23