Golang使用字符串模拟加法, 实现两个大数相加 | Golang入坑记

  • 2018-12-09
  • 252
  • 0

直接上代码

/**
 字符串模拟加法
 计算两个大数之和
 */
func largeNumberSum(n, m string) string {
    var (
        nLen   = len(n)
        mLen   = len(m)
        maxLen = getMax(nLen, mLen)
        flag = false
        carryBit byte
        result []byte
    )
    // 反转字符串
    n = reverse(n)
    m = reverse(m)

    // 较短的字符串补0
    if nLen < mLen {
        for i := nLen; i < mLen; i++ {
            n += "0"
        }
    } else {
        for i := mLen; i < nLen; i++ {
            m += "0"
        }
    }

    for i := 0; i < maxLen; i++ {
        nSum := (n[i] - '0') + (m[i] - '0')

        if nSum > 9 {
            if i == maxLen-1 {
                flag = true
            }

            carryBit = 1
            result = append(result, nSum - 10 + '0')
        } else {
            carryBit = 0
            result = append(result, nSum + '0')
        }
    }

    if flag {
        result = append(result, carryBit + '0')
    }

    return reverse(string(result))
}

/**
 获取两数中最大的数
 */
func getMax(n, m int) int {
    if n > m {
        return n
    }
    return m
}

/**
 反转字符串
 */
func reverse(str string) string {
    var result []byte
    tmp := []byte(str)
    tmpLen := len(tmp)

    for i := 0; i < tmpLen; i++ {
        result = append(result, tmp[tmpLen-i-1])
    }

    return string(result)
}

测试:

func main() {
    fmt.Println(largeNumberSum("123456789999999", "123"))
}
// 结果
// 123456789999012

文章作者: 燕归来
原始链接: https://www.yguilai.com/?p=591
除非特殊说明, 本站所有文章采用 “署名-非商用-相同方式共享 4.0” 协议
转载请注明原文链接及作者


评论

还没有任何评论,你来说两句吧