解析数字字符串数字
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
我正在尝试计算作为长数字字符串一部分的几位数字的乘法结果。这是我的代码:
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