问题描述
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向前进一位
go实现
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 } //将'0'-'9'映射到数字0-9,将'a'-'z'映射到数字10-35 func GetInt(a uint8) int { if a-'0' > 0 && a <= '9' { return int(a - '0') } else { return int(a-'A') + 10 } }