Fix error in calculation

This commit is contained in:
David Doblas Jiménez 2021-10-31 15:35:36 +01:00
parent 90bfb60fff
commit c99257d48f

View File

@ -9,26 +9,37 @@ https://projecteuler.net/problem=17 =#
using BenchmarkTools using BenchmarkTools
function num2letters(num, dic) function num2letters(num)
nums = Dict(
0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five",
6 => "six", 7 => "seven", 8 => "eight", 9 => "nine", 10 => "ten",
11 => "eleven", 12 => "twelve", 13 => "thirteen", 14 => "fourteen",
15 => "fifteen", 16 => "sixteen", 17 => "seventeen", 18 => "eighteen",
19 => "nineteen", 20 => "twenty", 30 => "thirty", 40 => "forty",
50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
90 => "ninety", 100 => "hundred", 1000 => "thousand"
)
if num <= 20 if num <= 20
return length(dic[num]) return length(nums[num])
elseif num < 100 elseif num < 100
tens, units = divrem(num, 10) tens, units = divrem(num, 10)
return length(dic[tens * 10]) + num2letters(units, dic) return (length(nums[Int(tens) * 10]) + num2letters(units))
elseif num < 1000 elseif num < 1000
hundreds, rest = divrem(num, 100) hundreds, rest = divrem(num, 100)
if rest != 0 if rest != 0
return num2letters(hundreds, dic) + length(dic[100]) return (num2letters(hundreds) + length(nums[100])
+ length("and") + num2letters(rest, dic) + length("and") + num2letters(rest))
else else
return num2letters(hundreds, dic) + length(dic[100]) return (num2letters(hundreds) + length(nums[100]))
end end
else else
thousands, rest = divrem(num, 1000) thousands, rest = divrem(num, 1000)
return num2letters(thousands, dic) + length(dic[1000]) return (num2letters(thousands) + length(nums[1000]))
end end
end end
function Problem17() function Problem17()
#= #=
If the numbers 1 to 5 are written out in words: one, two, three, four, If the numbers 1 to 5 are written out in words: one, two, three, four,
@ -41,20 +52,11 @@ function Problem17()
forty-two) contains 23 letters and 115 (one hundred and fifteen) contains forty-two) contains 23 letters and 115 (one hundred and fifteen) contains
20 letters. The use of "and" when writing out numbers is in compliance 20 letters. The use of "and" when writing out numbers is in compliance
with British usage. =# with British usage. =#
nums = Dict(
0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five",
6 => "six", 7 => "seven", 8 => "eight", 9 => "nine", 10 => "ten",
11 => "eleven", 12 => "twelve", 13 => "thirteen", 14 => "fourteen",
15 => "fifteen", 16 => "sixteen", 17 => "seventeen", 18 => "eighteen",
19 => "nineteen", 20 => "twenty", 30 => "thirty", 40 => "forty",
50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
90 => "ninety", 100 => "hundred", 1000 => "thousand"
)
n = 1000 n = 1000
letters = 0 letters = 0
for num in 1:n for num in 1:n
letters += num2letters(num, nums) letters += num2letters(num)
end end
return letters return letters
end end