【问题标题】:Parse number string digits解析数字字符串数字
【发布时间】:2016-11-03 10:40:10
【问题描述】:

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

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() 测试.go:10 +0x55 退出状态2

【问题讨论】:

    标签: go strconv


    【解决方案1】:

    有几个问题...

    首先,你需要从 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 本身为 nil 时打印 err.Error()(由于 != 和 == 的逻辑翻转)

    【讨论】:

      【解决方案2】:

      您的代码可以修正这两个错别字:
      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') 将一个字符转换为整数,
      然后像这样使用forrange

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        相关资源
        最近更新 更多