golang刷leetcode技巧之如何实现大数相乘

这篇文章将为大家详细讲解有关golang刷leetcode技巧之如何实现大数相乘,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我们提供的服务有:成都做网站、网站建设、外贸营销网站建设、微信公众号开发、网站优化、网站认证、洛阳ssl等。为千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的洛阳网站制作公司

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

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"

说明:

num1 和 num2 的长度小于110。

num1 和 num2 只包含数字 0-9。

num1 和 num2 均不以零开头,除非是数字 0 本身。

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解题思路:

     1,两数相乘最大长度是两个数的长度相加

     2,num1[i] 和 num2[j]相乘,结果只影响i+j 位和i+j+1位

          r[i+j+1]+= (r[i+j]+n1[i]*n2[j])/10          r[i+j]= (r[i+j]+n1[i]*n2[j])%10

     3,计算结果转string需要关注头部的0,如果全0,保留一个0

代码实现:

func multiply(num1 string, num2 string) string {   n1:=str2int(num1)   n2:=str2int(num2)   if n1==nil || n2==nil{       return ""   }
  r:=make([]int64,len(n1)+len(n2))
  for i:=0;i       for j:=0;j          r[i+j+1]+= (r[i+j]+n1[i]*n2[j])/10          r[i+j]= (r[i+j]+n1[i]*n2[j])%10       }   }
  var s string     j:=len(r)-1   for j>0 && r[j]==0{       j--   }   for i:=0;i<=j;i++{       s=fmt.Sprintf("%d",r[i])+s   }   return s}

func str2int(num string )[]int64{  if len(num)==0{    return nil  }  var r []int64  for i:=0;i    v,err:=strconv.ParseInt(string([]byte{num[i]}),10,10)      if err!=nil{        return nil      }      r=append([]int64{v},r...)  }  return r}

关于“golang刷leetcode技巧之如何实现大数相乘”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


网站栏目:golang刷leetcode技巧之如何实现大数相乘
本文网址:http://cdiso.cn/article/jhipcp.html