Go практические задачи. Решаем задания с codewars Golang
👣 Решаем задачи с codewars
Последняя цифра огромного числа
Для данного списка {x1, x2, x3, …, xn} вычислить последнюю (десятичную) цифру
x1 ^ (x2 ^ (x3 ^ (… ^ xn))).
Примеры
Пример 1
LastDigit([]int{3, 4, 2}) // должно вернуть 1
потому что 3 ^ (4 ^ 2) = 3 ^ 16 = 43046721
Примечания
Прогрессия растет невероятно быстро. Например, 9 ^ (9 ^ 9) имеет более 369 миллионов цифр. LastDigit должен эффективно обрабатывать такие числа.
0 ^ 0 = 1
0 ^ (0 ^ 0) = 0 ^ 1 = 0
Пустой список следует рассматривать как равный 1
Решение
package src
func LastDigit(as []int) int {
if len(as) == 0 {
return 1
}
for key := len(as) - 1; key > 0; key-- {
if as[key] == 0 {
as[key-1] = 1
as = as[:key]
continue
} else if as[key] == 1 {
as = as[:key]
continue
}
if as[key-1]%10 == 2 || as[key-1]%10 == 3 || as[key-1]%10 == 7 || as[key-1]%10 == 8 {
switch as[key] % 4 {
case 0:
as[key-1] = pow(as[key-1], 4)
case 1:
as[key-1] = pow(as[key-1], 5)
case 2:
as[key-1] = pow(as[key-1], 6)
case 3:
as[key-1] = pow(as[key-1], 7)
}
} else if as[key-1]%10 == 4 || as[key-1]%10 == 9 || as[key-1]%10 == 1 {
switch as[key] % 2 {
case 0:
as[key-1] = pow(as[key-1], 2)
case 1:
as[key-1] = pow(as[key-1], 3)
}
} else if as[key-1]%10 == 5 {
as[key-1] = 25
} else if as[key-1]%10 == 6 {
as[key-1] = 36
} else if as[key-1]%10 == 0 {
as[key-1] *= as[key-1]
}
as = as[:key]
}
return as[0] % 10
}
func pow(a, b int) int {
result := getDigs(a)
for i := 1; i < b; i++ {
result = getDigs(result * a)
}
return result
}
func getDigs(a int) int {
if a > 1000 {
return a % 1000
}
return a
}
+1
2
+1
1
+1
+1
+1