2016-07-01 10 views
1

長い数字ストリングの一部である数桁の乗算結果を計算しようとしています。ここに私のコードは次のとおりです。= 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

しかし、私のランタイムを取得エラー:

パニック:ランタイムエラー:無効なメモリアドレスまたはゼロポインタ参照 [信号0xc0000005でコード= 0x0のADDR = 0x20のPC = 0x40130e]

ゴルーチン1 [実行]: main.getMult(0x3の、0x534d40 、0x1a、0x4d2701) test.go:25 + 0x17e main.main() test.go:10 + 0x55を 終了ステータス2

答えて

1

これら二つのタイプミスを修正していきますあなたのコード:
変更mult := 0からmult := 1
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 
} 

また、あなたが
、長さ10でインデックス3から新しい文字列を取得するためにinputNum[3:13]を使用することができ、あなたは数を整数に1つの文字を変換するために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

夫婦の問題があります...

まず、あなたがそうでなければあなただけ継続的に乗算し、1でMULTを起動する必要があります0を入力すると常に0が返されます。

2番目のエラーチェックのロジックが反転しています。それは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()を印刷しようとしていたので、あなたがなっていたエラーでした=!そして、==)

関連する問題