我正在尝试计算一些数字的乘法结果,这是长数字字符串的一部分。这是我的代码:
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
答案 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