大数相乘--golang简单实现

栏目: Go · 发布时间: 7年前

内容简介:大数乘法之golang实现所谓大数相乘(Multiplication algorithm),就是指数字比较大,相乘的结果超出了基本类型的表示范围,所以这样的数不能够直接做乘法运算。模拟乘法手算累加

大数乘法之golang实现

所谓大数相乘(Multiplication algorithm),就是指数字比较大,相乘的结果超出了基本类型的表示范围,所以这样的数不能够直接做乘法运算。

解法:

模拟乘法手算累加

9  8
×       2  1
-------------
       (9)(8)  <---- 第1趟: 98×1的每一位结果 
  (18)(16)     <---- 第2趟: 98×2的每一位结果 
-------------
  (18)(25)(8)  <---- 这里就是相对位的和,还没有累加进位

这里唯一要注意的便是进位问题,我们可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑。从右向左依次累加,如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余后的个位数,而将十位数进位(通过模运算得到)累加到高位便可,循环直到累加完毕。

代码如下:

package main

import "fmt"

func main() {
    a := "999999999999"
    b := "111111111111"
    c := BigMulti(a, b)
    fmt.Println(c)
}

//BigMulti 大数相乘
func BigMulti(a, b string) string {
    if a == "0" || b == "0" {
        return "0"
    }
    // string转换成[]byte,容易取得相应位上的具体值
    bsi := []byte(a)
    bsj := []byte(b)

    temp := make([]int, len(bsi)+len(bsj))
    //两数相乘,结果位数不会超过两乘数位数和,即temp的长度只可能为 len(num1)+len(num2) 或 len(num1)+len(num2)-1
    // 选最大的,免得位数不够
    for i := 0; i < len(bsi); i++ {
        for j := 0; j < len(bsj); j++ {
            // 对应每个位上的乘积,直接累加存入 temp 中相应的位置
            temp[i+j+1] += int(bsi[i]-'0') * int(bsj[j]-'0')
        }
    }

    //统一处理进位
    for i := len(temp) - 1; i > 0; i-- {
        temp[i-1] += temp[i] / 10 //对该结果进位(进到前一位)
        temp[i] = temp[i] % 10    //对个位数保留
    }

    // a 和 b 较小的时候,temp的首位为0
    // 为避免输出结果以0开头,需要去掉temp的0首位
    if temp[0] == 0 {
        temp = temp[1:]
    }
    //转换结果:将[]int类型的temp转成[]byte类型,
    //因为在未处理进位的情况下,temp每位的结果可能超过255(go中,byte类型实为uint8,最大为255),所以temp选用[]int类型
    //但在处理完进位后,不再会出现溢出
    res := make([]byte, len(temp)) //res 存放最终结果的ASCII码

    for i := 0; i < len(temp); i++ {
        res[i] = byte(temp[i] + '0')
    }

    return string(res)
}

以上所述就是小编给大家介绍的《大数相乘--golang简单实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序设计语言

程序设计语言

斯科特 / 裘宗燕 / 电子工业出版社 / 2005-1 / 88.00元

这是一本很有特色的教材,其核心是讨论程序设计语言的工作原理和技术。本书融合了传统的程序设计语言教科书和编译教科书的有关知识,并增加了一些有关汇编层体系结构的材料,以满足没学过计算机组织的学生们的需要。书中通过各种语言的例子,阐释了程序设计语言的重要基础概念,讨论了各种概念之间的关系,解释了语言中许多结构的形成和发展过程,以及它们演化为今天这种形式的根源。书中还详细讨论了编译器的工作方式和工作过程,......一起来看看 《程序设计语言》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具