公众号merlinsea
- 十进制的加法问题描述
- 假设在没有直接使用加法运算的情况下,给定两个数字字符串,求解两个数字的加法和。 比如“456”+“147” = “603”,可以先用两个数字的个位相加,再计算十位相加,再计算百位相加。
- 求解解题思路
- 在计算“456”+“147”的时候,可以先用个位的6和个位的7相加,一开始默认进位项是0,所以个位相加的结果是6+7+0(0代表进位项)=13,所以最终结果的个位是3,由于13已经超过了10,所以计算十位相加时进位项应该设为1,因此计算十位的过程是 5+4+1(1代表进位项)=10.所以最终结果的十位是0,继续进位1,同理计算百位 是4+1+1(1是进位项)=6,因此最终结果的百位是6,百位计算完以后进位是0,因此最终结果是603
- 代码实现
- 将int类型转为string类型,用strconv.Itoa()
package main import ( "fmt" "strconv" ) var mp = make(map[byte]int) func main() { r := add10("99", "9") fmt.Println(r) } func init() { var k = 0 for i := '0'; i <= '9'; i++ { mp[byte(i)] = k k++ } } func add10(num1 string, num2 string) string { var i = len(num1) - 1 var j = len(num2) - 1 var bit = 0 var str string = "" for i >= 0 && j >= 0 { var r = mp[num1[i]] + mp[num2[j]] + bit bit = r / 10 str = strconv.Itoa(r%10) + str i-- j-- } for i >= 0 { var r = mp[num1[i]] + bit bit = r / 10 str = strconv.Itoa(r%10) + str i-- } for j >= 0 { var r = mp[num2[j]] + bit bit = r / 10 str = strconv.Itoa(r%10) + str j-- } if bit > 0 { str = strconv.Itoa(bit) + str } return str }
- 36进制的加法问题描述
- 假设现在有36进制,基本字符是0-9,a-z,其中a代表十进制的10,z代表十进制的35,因此1a+3z 的结果是59(36进制),因为1a是36进制,转为十进制是36+10 = 46 , 3z也是36进制,转为10进制是 3*36+35 = 143, 因此1a+3z的十进制结果是 46+143 = 189,59(36进制)转为十进制是5*36+9 = 189 。
- 因此设计一种算法可以实现36进制的加法运算
package main import ( "fmt" "strconv" ) var mp = make(map[byte]int) func main() { //r := add10("99", "9") r := add36("1a", "3z") fmt.Println(r) } func init() { var k = 0 for i := '0'; i <= '9'; i++ { mp[byte(i)] = k k++ } for i := 'a'; i <= 'z'; i++ { mp[byte(i)] = k k++ } } //将十进制的k转为36进制然后返回结果,进制转化的重点!! func convetTo36(k int) string { var str string = "" for k > 0 { r := k % 36 k = k / 36 str = strconv.Itoa(r) + str } return str } func add36(num1 string, num2 string) string { var i = len(num1) - 1 var j = len(num2) - 1 // bit是36进制下的进位结果,比如进位bit=1,表示在十进制下十进位36 var bit byte = '0' var str string = "" for i >= 0 && j >= 0 { var r = mp[num1[i]] + mp[num2[j]] + mp[byte(bit)] // 10进制的结果 // 先转36进制 rStr := convetTo36(r) // len(rStr) 最大只能是2 if len(rStr) > 1 { bit = rStr[0] str = string(rStr[1]) + str } else { str = string(rStr[0]) + str bit = '0' } i-- j-- } for i >= 0 { var r = mp[num1[i]] + mp[byte(bit)] // 10进制的结果 // 先转36进制 rStr := convetTo36(r) if len(rStr) > 1 { bit = rStr[0] str = string(rStr[1]) + str } else { str = string(rStr[0]) + str bit = '0' } i-- } for j >= 0 { var r = mp[num2[j]] + mp[byte(bit)] // 10进制的结果 // 先转36进制 rStr := convetTo36(r) if len(rStr) > 1 { bit = rStr[0] str = string(rStr[1]) + str } else { str = string(rStr[0]) + str bit = '0' } j-- } if bit != '0' { str = string(bit) + str } return str }