Разбор номера строки цифры
Я пытаюсь вычислить результат умножения нескольких цифр, которые являются частью длинной строки цифр. Вот мой код:
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
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')
преобразовать один символ в целое число,
затем используйте 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
Есть пара проблем...
Во-первых, вам нужно начинать mult с 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.Error()
когда err
само по себе было ноль (из-за логического переворота!= и ==)