1

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

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

但我得到一个运行时错误:

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

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

4

2 回答 2

2

有几个问题...

首先,你需要从 1 开始 mult,否则你只会不断地乘以 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
}

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

于 2016-07-01T06:32:32.853 回答
1

您的代码将修复这两个错别字:
更改mult := 0mult := 1
并更改err != nilerr == 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
于 2016-07-01T07:16:41.777 回答