题解 | #大数加法的Go语言实现#
大数加法
http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475
概述
大数加法的核心思想是,将待求解的两个整数转换为两个动态数组(切片)的形式,然后对数组的每个位进行相加,得到一个和数组,最后将和数组整理成符合10进制的数组。 以下面以大整数和相加为例进行说明:其中,可以表示为一个数组, 也可以表示一个数组。
首先,按照将和转换为逆存的整型数组,和整型数组。例如:转换成。这样做的主要目的是为了方便后续实现基于数组的大整数加法运算。
其次,比较和的的数组长度,并选择长度长的数组作为结果数据存储数组,这里假设的长度大于的长度,于是选择作为存储结果的数组,及每个数组位运算为,()。
接着,对计算的结果数组进行相应的进为处理,即判定是否成立,如果不成立则不改变第位的值;否则,将除以 10的余数作为的值,而作为第的新值。
最后,逆转数组做输出结果。
例子:
最高位不进位的情况:如,,那么此时,数组,。由于此时,的长度为3大于的长度2,于是选择作为结果存储数组,即,且初始计算得。然后处理数组如下:
, ,,
于是此时,,逆转后得输出结果为202。
最高位进位的情况:如,,那么此时,数组,。由于此时,的长度为3等于的长度3,可任意选择或者作为结果存储数组,这里选择作为结果存储数组。即,且初始计算得;然后处理数组如下:
, ,,,
于是此时,,逆转后得输出结果为1011。值得注意的是,最初数组的长度为3,为了存储,需要在考虑最高位进位的情况时,先对原始数组进行扩容。
基于Go语言的代码实现
func Plus(s,t string) string{
s1:=Convtoarray(s)
s2:=Convtoarray(t)
max,min:=maxlenarray(&s1,&s2)
for i:=0;i<len(*min);i++{
(*max)[i]=(*max)[i]+(*min)[i]
}
for i:=0;i<len(*max);i++{
if (*max)[i]>=10 && i<len(*max)-1{
h:=(*max)[i]
(*max)[i]=h%10
(*max)[i+1]=h/10+(*max)[i+1]
}else if i==len(*max)-1 && (*max)[i]>=10{
h:=(*max)[i]
(*max)[i]=h%10
(*max)=append(*max,h/10)
}
}
return Reconstruct(*max)
}
func maxlenarray(s1,s2 *[]int) (*[]int,*[]int){
if len(*s1)>len(*s2){
return s1,s2
}
return s2,s1
}
func Convtoarray(s string) []int{
a:=[]byte(s)
var arr []int
for i:=len(a)-1;i>=0;i--{
arr=append(arr,int(a[i])-48)
}
return arr
}
func Reconstruct(arr []int) string{
var str []byte
for i:=len(arr)-1;i>=0;i--{
str=append(str,byte(arr[i]+48))
}
return string(str)
}