Разбор номера строки цифры

Я пытаюсь вычислить результат умножения нескольких цифр, которые являются частью длинной строки цифр. Вот мой код:

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') преобразовать один символ в целое число,
затем используйте 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

Есть пара проблем...

Во-первых, вам нужно начинать 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 само по себе было ноль (из-за логического переворота!= и ==)

Другие вопросы по тегам