【剑指offer】NC10 大数乘法 [Go语言]

136 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。

数据范围: 读入的数字大小满足0≤n≤10^1000

要求:空间复杂度 O(n),时间复杂度 O(n^2)

示例1

输入:

"11","99"

返回值:

"1089"

说明:

11*99=1089 

示例2

输入:

"1","0"

返回值:

"0"

题解

这道题目必然不能用暴力方法,肯定会超时,所以我们使用最原始的一种方法。模拟,模拟这个过程。不断地进位,当res刚开始有0的话,就将0去掉,最终输出res的字符串类型。

AC Code

func solve( s string ,  t string ) string {
    if s=="0"||t=="0"{
        return "0"
    }
(1)    res := make([]int,len(s)+len(t))
    for i:=len(s)-1;i>=0;i--{
        for j:=len(t)-1;j>=0;j--{
(2)            sum := int(s[i]-'0')*int(t[j]-'0')+res[i+j+1]
(3)            res[i+j+1] = sum%10
(4)            res[i+j] += sum/10
        }
    }
(5)    result := []byte{}
(6)    for i:=0; i<len(res); i++ {
        if i==0 && res[i]==0 {
(7)            continue
        }
(8)        result = append(result,byte(res[i]+'0'))
    }
(9)    return string(result)
}
  • (1) 开辟一个两个字符串长度加起来的res长度
  • (2) 每个数取出来,进行相乘,并且加上前一个值(这个值上一个相加的进位数)
  • (3) 取余,保存一位
  • (4) 进位,对这一列的数进行相加
  • (5) 定义一个byte切片
  • (6) 遍历这个res结果,要转化成字符串
  • (7) 从指定位置开始,并具有指定的长度
  • (8) 对这个数组进行追加
  • (9) 返回string类型