2016-07-01 2 views
1

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

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 шт = 0x40130e]

goroutine 1 [работает]: main.getMult (0x3, 0x534d40 , 0x1a, 0x4d2701) test.go: 25 + 0x17e main.main() test.go: 10 + 0х55 статус выхода 2

ответ

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

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

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