解析数字字符串数字

时间:2016-07-01 06:14:25

标签: go strconv

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

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

但是我遇到了运行时错误:

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

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

2 个答案:

答案 0 :(得分: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
}

您获得的错误是因为当err.Error()本身为零时(由于逻辑上的!=和==),您试图打印err

答案 1 :(得分:1)

您的代码将修复这两个拼写错误:
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