How to Find the Last Fibonacci Digit in Golang


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))
  })
})