This problem defines a sum.
11 + 22 + 33 + 44 + 55 + 66 + 77 + 88 + 99 + 1010
Lets call that S10. We are told that S10 is equal to 10405071317.
Our task is now to find the last ten digits fo S1000.
This is relatively simple – I have solved similar problems before. The challenge is that
999^999
## [1] Inf
has an awfull lot of digits. The number is so large that R tells me it is infinite.
We are only interested in the last ten digits however, and R handles ten digits without problems.
Instead of using the built-in power function, I’ll make my own.
selfPower <- function(x){
res <- 1
for(i in 1:x){
res <- (res*x)%%10000000000000
}
res
}
The function takes x as input. Multiply the result (initialized to 1) with x, and do that x times. After each multiplication, it keeps the last 13 digits as the result. Whatever happens with the rest of the digits is uninteresting.
I’ll run that function on all numbers from 1 to 1000. And then I’ll have to add it all together.
Adding stuff up, I’ll run into the same problem. So instead of using the built-in add-function, I’m writing my own.
adding <- function(x,y){
(x+y)%%100000000000
}
It takes two numbers. Add them, and return the last 11 digits.
Putting that together, and doing a bit of functional programming using purrr:
library(purrr)
answer <- 1:1000 %>%
(function(x) sapply(x, selfPower)) %>%
reduce(adding) %>%
(function(x) x%%10000000000)
I’m passing the numbers 1:1000 to an anonymous function, that sapply’s selfPower on the x’es. Then I reduce the results using adding. And finally that result is passed to a second anonymous function, that returns the last ten digits.
Lessons learned:
1. Anonymous functions should be inside parantheses.
2. I run a version of the magrittr library, that has an interesting error in the error message when you learn lesson 1: “Error: Anonymous functions myst be parenthesized”