算法:字符串相乘

 题目描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例:

输入: num1 = "2", num2 = "3" 输出: "6" 输入: num1 = "123", num2 = "456" 输出: "56088"

//字符串相乘

//做加法 1234 * 567
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    ans := "0"
    m, n := len(num1), len(num2)

    //遍历字符串num2
    for i := n - 1; i >= 0; i-- {
        curr := ""
        //进位
        add := 0

        for j := n - 1; j > i; j-- {
            curr += "0"
        }

        //转换为整数
        y := int(num2[i] - '0')

        //做乘法
        for j := m - 1; j >= 0; j-- {
            //转换为整数
            x := int(num1[j] - '0')

            product := x * y + add
            //itoa 整形转换为字符串
            //curr 为对应的每一位数
            curr = strconv.Itoa(product % 10) + curr
            add = product / 10
        }

        //处理最后一个进位
        for ; add != 0; add /= 10 {
            curr = strconv.Itoa(add % 10) + curr
        }

        ans = addStrings(ans, curr)
    }

    return ans
}


func addStrings(num1, num2 string) string {
    i, j := len(num1) - 1, len(num2) - 1
    add := 0
    ans := ""
    //add 也要判断
    for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {
        x, y := 0, 0
        if i >= 0 {
            x = int(num1[i] - '0')
        }
        if j >= 0 {
            y = int(num2[j] - '0')
        }
        result := x + y + add
        ans = strconv.Itoa(result % 10) + ans
        add = result / 10
    }
    return ans
}


//做乘法
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    m, n := len(num1), len(num2)
    ansArr := make([]int, m + n)

    for i := m - 1; i >= 0; i-- {
        x := int(num1[i]) - '0'
        for j := n - 1; j >= 0; j-- {
            y := int(num2[j] - '0')
            //相乘
            ansArr[i + j + 1] += x * y
        }
    }

    for i := m + n - 1; i > 0; i-- {
        ansArr[i - 1] += ansArr[i] / 10
        ansArr[i] %= 10
    }

    //存储最终结果
    ans := ""
    idx := 0
    if ansArr[0] == 0 {
        idx = 1
    }
    for ; idx < m + n; idx++ {
        //整形转换为字符串
        ans += strconv.Itoa(ansArr[idx])
    }

    return ans
}

参考链接:https://leetcode-cn.com/problems/multiply-strings/solution/zi-fu-chuan-xiang-cheng-by-

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值