解析数字字符串数字

Parse number string digits

我正在尝试计算作为长数字字符串一部分的几位数字的乘法结果。这是我的代码:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    inputNum := "73167176531330624919225119"
    mult := getMult(3, inputNum)

    fmt.Printf("Mult = %d", mult)

}

func getMult(startIndex int, inputNum string) int {
    mult := 0
    for i := 0; i < 10; i++ {

        digit, err := strconv.Atoi(string(inputNum[startIndex+i]))

        if err != nil {
            mult *= int(digit)
        } else {
            fmt.Printf("Error converting %s to int  : %s\n", string(inputNum[startIndex+i]), err.Error())
        }

    }
    return mult
}

我要得到的结果是6*7*1*7*6*5*3*1*3*3 = 238140

但是我遇到运行时错误:

恐慌:运行时错误:无效的内存地址或零指针取消引用 [信号 0xc0000005 代码=0x0 地址=0x20 pc=0x40130e]

协程 1 [运行]: main.getMult(0x3, 0x534d40, 0x1a, 0x4d2701) test.go:25 +0x17e main.main() test.go:10 +0x55 退出状态 2

有几个问题...

首先,您需要从 1 开始乘法,否则您将不断乘以 0 并始终得到 0。

其次,您的错误检查逻辑被翻转了。应该是if err == nil

这似乎是你想要的:

func getMult(startIndex int, inputNum string) int {
    mult := 1
    for i := 0; i < 10; i++ {
        digit, err := strconv.Atoi(string(inputNum[startIndex+i]))
        if err == nil {
            mult *= int(digit)
        } else {
            fmt.Println(err)
        }

    }
    return mult
}

你得到的错误是因为当 err 本身为零时你试图打印 err.Error()(由于 != 和 == 的逻辑翻转)

您的代码可以修复这两个拼写错误:
mult := 0 更改为 mult := 1
并将 err != nil 更改为 err == nil,如下所示:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    inputNum := "73167176531330624919225119"
    mult := getMult(3, inputNum)
    fmt.Printf("Mult = %d", mult)
}

func getMult(startIndex int, inputNum string) int {
    mult := 1
    for i := 0; i < 10; i++ {
        digit, err := strconv.Atoi(string(inputNum[startIndex+i]))
        if err == nil {
            mult *= int(digit)
        } else {
            fmt.Printf("Error converting %s to int  : %s\n", string(inputNum[startIndex+i]), err.Error())
        }
    }
    return mult
}

您也可以使用 inputNum[3:13] 从索引 3 获取长度为 10 的新字符串,
你可以使用 int(v - '0') 将一个字符转换为整数,
然后像这样使用 for range

package main

import "fmt"

func main() {
    inputNum := "73167176531330624919225119"
    mult := getMult(inputNum[3:13])
    fmt.Printf("Mult = %d \n", mult) // Mult = 238140
}

func getMult(str string) int {
    m := 1
    for _, v := range str {
        if v >= '0' && v <= '9' {
            m *= int(v - '0')
        } else {
            fmt.Printf("Error converting %q to int\n", v)
            break
        }
    }
    return m
}

输出:

Mult = 238140