The challenge
Return the last digit of the nth element in the Fibonacci sequence (starting with 1,1, to be extra clear, not with 0,1 or other numbers).
LastFibDigit(1) == 1
LastFibDigit(2) == 1
LastFibDigit(3) == 2
LastFibDigit(1000) == 5
LastFibDigit(1000000) == 5
The solution in Golang
Option 1:
package solution
func LastFibDigit(n int) int {
n %= 60
a, b := 0, 1
for i := 0; i<n; i++ { a, b = b, a+b }
return a % 10
}
Option 2:
package solution
func LastFibDigit(n int) int {
fib := []int{0, 1}
for i := 1; i < 60; i++ {
fib = append(fib, (fib[i]+fib[i-1])%10)
}
j := n % 60
return fib[j]
}
Option 3:
package solution
import "math"
func LastFibDigit(n int) int {
return int(math.Pow(math.Phi, float64(n%60))/math.Sqrt(5) + 0.5) % 10
}
Test cases to validate our solution
package solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Sample test cases", func() {
It("Basic tests", func() {
Expect(LastFibDigit(1)).To(Equal(1))
Expect(LastFibDigit(21)).To(Equal(6))
Expect(LastFibDigit(302)).To(Equal(1))
Expect(LastFibDigit(4003)).To(Equal(7))
Expect(LastFibDigit(50004)).To(Equal(8))
Expect(LastFibDigit(600005)).To(Equal(5))
Expect(LastFibDigit(7000006)).To(Equal(3))
Expect(LastFibDigit(80000007)).To(Equal(8))
Expect(LastFibDigit(900000008)).To(Equal(1))
Expect(LastFibDigit(1000000009)).To(Equal(9))
})
})