两个二进制数相加 |
您所在的位置:网站首页 › 68二进制怎么算 › 两个二进制数相加 |
题目如下: /* Given two binary strings, return their sum (also a binary string). For example, a = “11” b = “1” Return “100”. */ 如果是c语言,就是实现这样的一个函数: char* addBinary(char* a, char* b) { } 小白:还好我的英文是4.5级。就是有两个二进制数,求它们的和,并且也表示为二进制数了。很简单啊,把这两个数转成int,再相加,再转成二进制数就行啦! 陆小凤:这个做法解决不了数值大小溢出的问题,在字符串很长的情况下是不可行的。故不考虑这个方向。 小白:… 我就知道你会这么说的。 (1)一个不简洁的迭代办法使用迭代的办法,逐位相加。 如何迭代? 一个while循环。从低位开始,每次取两个数字及进位相加(如果没有两个数字及进位,则迭代结束),记录本次相加的结果及新的进位值。字符串向高位移动,开始新的一轮迭代。 * 如何相加? 如果按两个数字跟进位的值来分情况判断,会繁琐一点。可以考虑都转化为int,再三者相加,对结果再分类(比如3时,说明新的进位值为1,并且本次相加的结果为1)。 * 如何向高位移动? 先取得两个字符串的最小长度为l,迭代时,每次取str[l_each_str-i-1],i=0 to (l-1),即可。 * 有哪些细节要注意? 在迭代结束后,还要看进位值是否为1。如果为1,则还需要再次迭代。每次拿剩下的数字,跟进位相加,在进位为0或没有剩余数字时结束。迭代结束后,判断进位的值,如果进位的值为1,则说明产生一个新的数字1。如果进位为0,则需要把剩余的数字直接作为返回的字符串的内容。 注意最终返回的字符串,在c语言中要以0结尾。 演示代码 #include #include #include char* addBinary(char* a, char* b) { int more = 0; int la = strlen(a); int lb = strlen(b); int lmin = la > lb ? lb : la; int lmax = la > lb ? la : lb; int retl = lmax + 1; char* retstr = (char*)malloc(retl); int i = 0; while (i < lmin) { char ca = a[la - i - 1]; char cb = b[lb - i - 1]; int ia = ((ca == '1') ? 1 : 0); int ib = ((cb == '1') ? 1 : 0); int temp = ia + ib + more; if (temp == 3) { retstr[retl - i - 1] = '1'; more = 1; } else if (temp == 2) { retstr[retl - i - 1] = '0'; more = 1; } else if (temp == 1) { retstr[retl - i - 1] = '1'; more = 0; } else { retstr[retl - i - 1] = '0'; more = 0; } i ++; } char* left = ((la > lb) ? a : b); if (more == 1) { while (i < lmax && more) { char c = left[lmax - i - 1]; int ic = (c == '1') ? 1 : 0; int temp = ic + more; if (temp == 2) { retstr[retl - i - 1] = '0'; more = 1; } else if (temp == 1) { retstr[retl - i - 1] = '1'; more = 0; } i ++; } } if (more == 1) { retstr[0] = '1'; char* rettemp = (char*)malloc(retl + 1); memmove(rettemp, retstr, retl); rettemp[retl] = 0; free(retstr); retstr = rettemp; } else { if (i =0 || j>=0) { c += i>=0 ? a[i--]-'0' : 0; c += j>=0 ? b[j--]-'0' : 0; ret += char(c&1) + '0'; c >>= 1; } reverse(ret.begin(), ret.end()); return ret; } }; int main(int argc, const char *argv[]) { string a="100"; string b="110010"; Solution so; string ret = so.addBinary(a, b); cout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |