1

I am trying to calculate the multiplication result of a few digits which are part of a long digits string. Here is my code:

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
}

The result I want to get is 6*7*1*7*6*5*3*1*3*3 = 238140

But I an getting a runtime error:

panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x20 pc=0x40130e]

goroutine 1 [running]: main.getMult(0x3, 0x534d40, 0x1a, 0x4d2701) test.go:25 +0x17e main.main() test.go:10 +0x55 exit status 2

Shai Aharoni
  • 1,955
  • 13
  • 25

2 Answers2

2

There are a couple problems...

First, you need to start mult at 1, otherwise you will just continually multiply by 0 and always get 0.

Secondly you have the logic for your err check flipped. It should be if err == nil

This seems to do what you want:

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
}

The error you were getting was because you were trying to print err.Error() when err itself was nil (due to the logical flip of != and ==)

sberry
  • 128,281
  • 18
  • 138
  • 165
1

your code will work with fixing these two typos:
change mult := 0 to mult := 1
and change err != nil to err == nil like this:

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
}

also you may use inputNum[3:13] to get new string from index 3 with length 10,
and you may use int(v - '0') to convert one character to integer number,
then use for range like this:

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
}

output:

Mult = 238140