Golang Codewars 中大量测试用例的最后一位失败了

问题描述 投票:0回答:1

定义一个函数,它接受两个非负整数 a 和 b 并返回 a^b 的最后一位十进制数字。请注意,a 或 b 可能非常大! 您可以假设输入始终有效。

package kata

import (
    "math"
    "strconv"
)


func ParseInt(n string) int {
    num, _ := strconv.ParseInt(n, 10, 64)
    return int(num)
}

func LastDigit(n1, n2 string) int {
    exponent := ParseInt(n2)
    if exponent == 0 {
        return 1
    }
  
    num := int(ParseInt(string(n1[len(n1)-1])))
  
    var lastDigit int
    if num%2 == 0 {
        lastDigit = 6
    } else {
        lastDigit = 1
    }
  
    switch n1[len(n1)-1] {
    case '0', '1', '5', '6':
        return num
    case '4', '9':
        if exponent%2 == 0 {
            return lastDigit
        }
        return num
    default:
        reminder := exponent % 4
        if reminder == 0 {
            return lastDigit
        }
        result := int(math.Pow(float64(num), float64(reminder))) * lastDigit % 10
        return result
    }
}

测试用例错误:预期 7 等于 1 测试用例错误:期望 3 等于 1

我尝试了代码编辑器,一切似乎都正常。但它仍然未能通过一些测试用例。

algorithm go equation-solving
1个回答
0
投票

功率结果的最后一位实际上遵循一个序列。 这是一个超级高效的函数来计算你想要的:

func test(n1 int64, n2 int64) int {
    result := 0

    var lastDigitsMap = make(map[int][]int)

    lastDigitsMap[1] = []int{1}
    lastDigitsMap[2] = []int{6, 2, 4, 8}
    lastDigitsMap[3] = []int{1, 3, 9, 7}
    lastDigitsMap[4] = []int{6, 4}
    lastDigitsMap[5] = []int{5}
    lastDigitsMap[6] = []int{6}
    lastDigitsMap[7] = []int{1, 7, 9, 3}
    lastDigitsMap[8] = []int{6, 8, 4, 2}
    lastDigitsMap[9] = []int{1, 9}

    n1LastDigit := int(n1 % 10)
    ldIndex := int(n2 % int64(len(lastDigitsMap[n1LastDigit])))
    result = lastDigitsMap[n1LastDigit][ldIndex]

    return result
}  
© www.soinside.com 2019 - 2024. All rights reserved.