题目描述
36进制由0-9,a-z,共36个字符表示。
要求按照加法规则计算出任意两个36进制正整数的和,如1b + 2x = 48 (解释:47+105=152)
要求:不允许使用先将36进制数字整体转为10进制,相加后再转回为36进制的做法
参考LC415. 字符串相加的扩展,在这道题的基础上额外对36进制进行处理
代码
package main
import (
"fmt"
"strings"
)
//ASCII码 A = 65 a = 97
func getInt(c byte) int {
if c >= '0' && c <= '9' {
return int(c - '0')
}
return int(c-'a') + 10
}
func getChar(x int) byte {
if x >= 0 && x <= 9 {
return byte(x) + '0'
}
return byte(x-10) + 'a'
}
func addString(num1, num2 string) string {
var res strings.Builder
i := len(num1) - 1
j := len(num2) - 1
carry := 0
for i >= 0 || j >= 0 || carry > 0 {
x := 0
y := 0
if i >= 0 {
x = getInt(num1[i])
}
if j >= 0 {
y = getInt(num2[j])
}
tmp := x + y + carry
carry = tmp / 36
res.WriteByte(getChar(tmp % 36))
i--
j--
}
result := res.String()
reversed := reverseString(result)
return reversed
}
func reverseString(s string) string {
runes := []rune(s)
n := len(runes)
for i := 0; i < n/2; i++ {
runes[i], runes[n-i-1] = runes[n-i-1], runes[i]
}
return string(runes)
}
func main() {
a := "1b"
b := "2x"
c := addString(a, b)
fmt.Printf("输出结果为:%v", c)
}
最后这个代码的输出结果为48