将int拆分为单独的数字,以便遍历每个数字

时间:2020-09-04 09:59:28

标签: go

是GoLang的新手。因此,每天都会遇到leetcode问题,即要减去整数的乘积和数字总和。为此,我最初考虑将整数拆分为单个数字,然后将所有数字相加/相乘以获得输出。但是无法做到这一点,因为我目前还不太了解类型转换。经过多次试验和错误后,我放弃了这种方法,并使用除法和取模来获取最后的数字并获取输出。这是我所做的:

func subtractProductAndSum(n int) int {
    sum, prod := 0, 1
    for {
        if n < 10 {
            sum += n
            prod *= n
            break
        }
        sum += n % 10
        prod *= n % 10
        n = n / 10
    }
    return prod - sum
}

这有效,但在其他答案中,我发现了一个有效的方法,该方法基于我的第一种方法(拆分和征服):

func subtractProductAndSum(n int) int {
    p := 1
    s := 0
    
    strN := strconv.Itoa(n)    
    for _, val := range strN {
        intVal := int(val - '0')
        p = p * intVal
        s = s + intVal   
    }
    
    return p - s   
}

以这种方式,我无法理解intVal := int(val - '0')。它肯定会获得所需的输出。我认为正在将val类型转换为int,但我无法理解 - '0'有什么帮助。

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:2)

您的strN包含一个与n相同的字符串值。 val中的for loop变量是character类型的数据,而不是int数字,并且绝对不会类型转换为int

变量val可以包含以下任何字符{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}

因此,如果您从任何数字字符中减去'0',您将得到'0'与实际上是您正在寻找的digit值的int之间的差异。

减法基本上是两个字符的ASCII值之差。

例如,如果从'0'中减去'5',将得到5,它是整数值。
ASCII'5'的{​​{1}}值为'0'53。因此,48实际上是'5' - '0',而实际上是53 - 48

这是代码中类型转换的工作方式。

相关问题