2016-07-01 100 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

但是我的得到一個運行時錯誤:

恐慌:運行時錯誤:無效的內存地址或零指針引用 [信號0000005代碼爲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 := 0mult := 1
和改變err != nilerr == 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

有幾個問題...

首先,你需要從1開始MULT,否則你只會連乘由0和總是得到0.

其次,你有你的err檢查翻轉的邏輯。它應該是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本身是零(由於邏輯翻轉=!和==)