36进制的加法

简介: 36进制的加法

公众号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
}


640.png



相关文章
|
7月前
|
存储
原码,补码的乘法运算
原码,补码的乘法运算
120 0
|
7月前
X 进制减法问题
X 进制减法问题
36 0
二进制浮点数的加减法运算
二进制浮点数的加减法运算
|
Python
一日一技:二进制减法是如何进行的
一日一技:二进制减法是如何进行的
179 0
二进制数的补码及运算(2)
二进制数的补码及运算(2)
311 0
二进制数的补码及运算(2)
十进制转换为2进制
十进制转换为2进制
106 0
十进制转换为2进制
|
存储
5.3.2_原补码的除法运算
计算机组成原理之原补码的除法运算
336 0
5.3.2_原补码的除法运算
二进制加法
二进制加法:目标只使用位运算符来实现,还有缺陷,留待后续解决
118 0
一种基于质数(2、3、5、7、11…)的变进制数,第一位为2进制,第二位为3进制,第三位为5进制,以此类推。请将该变进制数转化为十进制数。
一种基于质数(2、3、5、7、11…)的变进制数,第一位为2进制,第二位为3进制,第三位为5进制,以此类推。请将该变进制数转化为十进制数。
176 0
一种基于质数(2、3、5、7、11…)的变进制数,第一位为2进制,第二位为3进制,第三位为5进制,以此类推。请将该变进制数转化为十进制数。
二进制数的补码及运算(1)
二进制数的补码及运算(1)
285 0