题解 | #大数加法的Go语言实现#

大数加法

http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

概述

大数加法的核心思想是,将待求解的两个整数转换为两个动态数组(切片)的形式,然后对数组的每个位进行相加,得到一个和数组,最后将和数组整理成符合10进制的数组。 以下面以大整数SSTT相加为例进行说明:其中,SS可以表示为一个数组S=sn1s0S=s_{n-1}\cdots s_{0}, TT也可以表示一个数组T=tl1t0T=t_{l-1}\cdots t_{0}

首先,按照将SSTT转换为逆存的整型数组,S=s0s1sn1S'=s_{0}s_{1}\cdots s_{n-1}和整型数组T=t0t1tl1T'=t_{0}t_{1}\cdots t_{l-1}。例如:S=100S=100转换成S=001S'=001。这样做的主要目的是为了方便后续实现基于数组的大整数加法运算。

其次,比较SS'TT'的的数组长度,并选择长度长的数组作为结果数据存储数组,这里假设SS'的长度nn大于TT'的长度ll,于是选择SS'作为存储结果的数组,及每个数组位ii运算为S[i]=S[i]+T[i]S'[i]=S'[i]+T'[i],(0i<l0\leq i<l)。

接着,对计算的结果数组SS'进行相应的进为处理,即判定S[i]>=10,(0i<n)S'[i]>=10,(0\leq i<n)是否成立,如果不成立则不改变第ii位的值S[i]S'[i];否则,将S[i]S'[i]除以 10的余数作为S[i]S'[i]的值,而S[i]/10+S[i+1]S'[i]/10+S'[i+1]作为第i+1i+1的新值。

最后,逆转数组SS'做输出结果。

例子:

最高位不进位的情况:如S=103S=103,T=99T=99,那么此时,数组S=[3,0,1]S'=[3,0,1],T=[9,9]T'=[9,9]。由于此时,SS'的长度为3大于TT'的长度2,于是选择SS'作为结果存储数组,即S[i]=S[i]+T[i]S'[i]=S'[i]+T'[i],且初始计算得S=[12,9,1]S'=[12,9,1]。然后处理数组SS'如下:

S[0]=[2]S'[0]=[2],S[1]=10S'[1]=10 S[0]=[2]S'[0]=[2],S[1]=0S'[1]=0,S[2]=2S'[2]=2

于是此时,S=[2,0,2]S'=[2,0,2],逆转后得输出结果为202。

最高位进位的情况:如S=103S=103,T=908T=908,那么此时,数组S=[3,0,1]S'=[3,0,1],T=[8,0,9]T'=[8,0,9]。由于此时,SS'的长度为3等于TT'的长度3,可任意选择SS'或者TT'作为结果存储数组,这里选择SS'作为结果存储数组。即S[i]=S[i]+T[i]S'[i]=S'[i]+T'[i],且初始计算得S=[11,0,10]S'=[11,0,10];然后处理数组SS'如下:

S[0]=[1]S'[0]=[1],S[1]=1S'[1]=1 S[0]=[1]S'[0]=[1],S[1]=1S'[1]=1,S[2]=0S'[2]=0,S[3]=1S'[3]=1

于是此时,S=[1,1,0,1]S'=[1,1,0,1],逆转后得输出结果为1011。值得注意的是,最初数组SS'的长度为3,为了存储S[3]S'[3],需要在考虑最高位进位的情况时,先对原始数组SS'进行扩容。

基于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)
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务