二进制的字符串形式加法

2017-04-20  本文已影响0人  linchih

要求:

  1. @input String a 字符串形式的二进制数
  2. @input String b 字符串形式的二进制数
  3. @output String c 字符串形式的二进制数,为a+b数值之和

思路:

将 a,b转换成数组,从最后一位向前逐步将a[index],b[index]放入一个半加器,半加器输入a,b,和一个进位输入carry,输出a+b+carry之和和一个进位输出,进位输出将成为下一轮进位输入,直至遍历完全部a,b.

代码:

var addBinary = function(a, b) {
    // 进位符号
  var carry = '0'
    var alength = a.length
    var blength = b.length
    //每次的输入a与b
    var inputa = ''
    var inputb = ''
    var res = []
    // 获取b与a中最大的长度
    var length = Math.max(alength,blength)
    //从各字符串的length-1即最后一位执行加法,循环至0结束
    for(var i = 1; i < length+1; i++){
        //在a或者b其中一个已经循环完的情况下,如果进位也为0,提前结束循环,把未循环完剩下的字符直接拼接到res上
        if((alength-i<0||blength-i<0) && carry==='0') {
            alength-i<0?res.push(b.substr(0,blength-i+1)):res.push(a.substr(0,alength-i+1))
            break
        }
       //令半加器的输入为当前字符,如果循环完,设输入为0
        inputa = a[alength-i] ||'0'
        inputb = b[blength-i] ||'0'
        //半加器
        switch(inputa+inputb+carry){
            case '111':
                res.push('1')
                carry = '1'
                break
            case '011':
            case '110':
            case '101':
                res.push('0')
                carry = '1'
                break
            case '001':
            case '010':
            case '100':
                res.push('1')
                carry = '0'
                break
            case '000':
                res.push('0')
                carry = '0'
                break
        }
    }
    //循环完还有进位未处理把进位添加到结果
    if(carry==='1')  res.push('1')
    return res.reverse().join('')   
};
上一篇 下一篇

猜你喜欢

热点阅读