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



相关文章
|
存储 边缘计算 固态存储
玄铁RISC-V处理器入门与实战-平头哥玄铁CPU IP-面向高性能领域CPU
玄铁RISC-V处理器入门与实战-平头哥玄铁CPU IP-
2685 1
|
数据可视化 UED 容器
JavaFX布局详解与代码实例
JavaFX布局详解与代码实例
452 0
|
弹性计算 运维 数据挖掘
DDD与微服务架构浅析
主要介绍DDD,微服务架构,以及两者之间的关系
DDD与微服务架构浅析
|
BI 索引 Python
python XlsxWriter模块execl文档生成详解(2)
python XlsxWriter模块execl文档生成详解(2)
python XlsxWriter模块execl文档生成详解(2)
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
存储 关系型数据库 MySQL
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余
本文详细介绍了MySQL数据库的相关知识和技术要点,包括架构、存储引擎、数据类型、索引、查询、事务和锁机制等内容。以下是简介: 本文从MySQL架构入手,详细讲解了其独特的插件式存储引擎设计,并深入探讨了连接层、服务层、存储引擎层和数据存储层的工作原理。接着,文章对比了常见的存储引擎如InnoDB与MyISAM的特点与应用场景。在数据类型章节,介绍了MySQL支持的主要数据类型及其用途。索引部分则深入剖析了B+树索引的优势及其在InnoDB中的实现细节,并解释了聚簇索引与非聚簇索引的区别。事务章节详细解释了ACID特性和隔离级别的概念,并介绍了MVCC机制。最后,锁机制部分
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余
|
存储 SQL 关系型数据库
MySQL 面试题
MySQL 的一些基础面试题
260 5
|
Java 测试技术
使用MybatisPlus时出现的java.lang.NullPointerException异常~
使用MybatisPlus时出现的java.lang.NullPointerException异常~
830 0
使用MybatisPlus时出现的java.lang.NullPointerException异常~

热门文章

最新文章