题目:
函数原型:
char * addBinary(char * a, char * b)
思路:
二进制相加,首先我们考虑先将字符串逆序。由此要写一个逆序函数reserve。字符串逆序后,从前往后相加,以较长的字符串的长度为标准长度n,另一未达标准长度字符串以 ‘0’ 补充(需要用辅助变量进行辅助相加,不可越界赋值为 ‘0’ )。创建新的字符串ans,申请空间为 n+2 个单位,初始化全部为 ‘0’ 。将两个字符串相加后的结果存入ans中,这里需要进行字符型数字与整型数字的转换。全部相加完成后,判断第 n+1 哥字符是否为 ‘0’ (初始时为 ‘0’),若仍为 ‘0’ 说明最后一位相加未进位,新字符串长度为 n+1 ,第 n+1 位赋值 ‘\0’,第n+2位也赋值为 ‘\0’;若不为 ‘0’ 说明最后一位相加进位了,第 n+1 位有值,将第 n+2 位赋值为 ‘\0’。最后再逆序新字符串ans(字符串逆序只会逆序 ‘\0’ 之前的字符),返回新字符串ans
关键1:为什么要将字符串逆序后再进行相加?
因为二进制相加可能会有进位问题,新字符串长度可能加1。如果不逆序,需要从后向前相加,前面留几个空间取决于相加后会不会进位,无法确定。相反,逆序后,从前向后相加,后面可以多留一个空间用于进位,如果没有进位该空间可置为 '\0' ,不影响字符串的再逆序。
关键2:为什么新的字符串要申请 n+2 个空间?
因为二进制相加后可能会进位,需要预留一个空间,再多申请一个空间用于存放 ‘\0’ 作为字符串结束标志。所以一共要多申请两个空间。
关键3:如何进行字符型数字于整型数字的转换?
字符型数字转整型数字:- ‘0’
整型数字转字符型数字:+ ‘0’
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>void reserve(char* arr)//逆序字符串
{int left = 0;int right = strlen(arr) - 1;while (left <= right){char tmp = '0';tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}char* addBinary(char* a, char* b)
{reserve(a);//逆序方便相加reserve(b);//逆序方便相加int sizea = strlen(a);//求长度int sizeb = strlen(b);//求长度int n = sizea > sizeb ? sizea : sizeb;//记下最大的长度char* ans = (char*)malloc(sizeof(char) * (n + 2));//创建最大长度+2的空间,因为可能要进位1个空间,还有一个空间用于存放\0memset(ans, '0', sizeof(char) * (n + 2));//全部初始化为0int i = 0;char aa = '0';//辅助变量char bb = '0';//辅助变量while (i < n){if(i>=sizea||i>=sizeb){if (i >= sizea)//判断相加时是否超出自己的长度,超出则补0处理{ans[i] = ans[i] - '0' + aa - '0' + b[i] - '0' + '0';}if (i >= sizeb)//判断相加时是否超出自己的长度,超出则补0处理{ans[i] = ans[i] - '0' + a[i] - '0' + bb - '0' + '0';}}else{ans[i] = ans[i] - '0' + a[i] - '0' + b[i] - '0' + '0';//新的字符串结果}if (ans[i] == '2')//进位判断(1+1的情况,前一位无进位){ans[i] = '0';//当前位置为0ans[i + 1] = ans[i + 1] - '0' + 1 + '0';//进位操作}if (ans[i] == '3')//进位判断(1+1的情况,前一位进位1){ans[i] = '1';//当前位置为1ans[i + 1] = ans[i + 1] - '0' + 1 + '0';//进位操作}i++;}//判断是否字符串长度增加(是否进位)if (ans[i] != '0')//进位了{ans[i + 1] = '\0';//最后一位置为\0}else//没有进位{ans[i] = '\0';//最后一位和倒数第二位都置为\0ans[i + 1] = '\0';}reserve(ans);//逆序昕字符串return ans;//返回新字符串
}