36進制由0-9,a-z,共36個字符表示,最小爲'0'
'0''9'對應十進制的09,'a''z'對應十進制的1035
例如:'1b' 換算成10進制等於 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47
要求按照加法規則計算出任意兩個36進制正整數的和
如:按照加法規則,計算'1b' + '2x' = '48'
要求:不允許把36進制數字整體轉爲10進制數字,計算出10進制數字的相加結果再轉回爲36進制
思路: 按照十進制的加法方法,滿36向前進一位
GetInt:將’0’-‘9’映射到數字0-9,將’a’-'z’映射到數字10-35
package main
import "fmt"
func GetInt(a uint8) int {
if a-'0' > 0 && a <= '9' {
return int(a - '0')
} else {
return int(a-'a') + 10
}
}
func main(){
fmt.Println(GetInt('b'))
}
$ go run test.go
35
36進制算法go實現:
package main
import "fmt"
func GetInt(a uint8) int {
if a-'0' > 0 && a <= '9' {
return int(a - '0')
} else {
return int(a-'a') + 10
}
}
func Add(str1 string, str2 string) string {
List36 := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
i := len(str1) - 1
j := len(str2) - 1
var sum string
var tem int //進位
for i >= 0 && j >= 0 {
s := GetInt(str1[i]) + GetInt(str2[j]) + tem
if s >= 36 {
tem = 1
sum = List36[s%36]+sum
} else {
tem = 0
sum = List36[s]+sum
}
i--
j--
}
for i >= 0 {
s:= GetInt(str1[i])+tem
if s>=36{
tem = 1
sum = List36[s%36]+sum
}else {
tem = 0
sum = List36[s]+sum
}
i--
}
for j >= 0 {
s:= GetInt(str2[i])+tem
if s>=36{
tem = 1
sum = List36[s%36]+sum
}else {
tem = 0
sum = List36[s]+sum
}
j--
}
if tem!=0{
sum="1"+sum
}
return sum
}
func main(){
fmt.Println(GetInt('z'))
fmt.Println(Add("bb", "2x"))
}