目前大一正在学习C语言。最近在leetcode上遇到一个二进制加法的问题,特此记录
Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
在我第一次编写代码的时候,测试成功,但是在运行的时候出现了错误
char buffer[100]={0};
char *addBinary(char *a, char *b)
{
memset(buffer,0,sizeof(100));
long int sum=0;
int i=0;
long int c=0;
int j=0;
int n;
int m;
m=atoi(a);
n=atoi(b);
while( m || n)
{
sum+=(m%10)*(pow(2,j))+(n%10)*(pow(2,j));
m=m/10;
n=n/10;
j++;
}
while(sum){
c+=(sum%2)*pow(10,i);
i++;
sum=sum/2;
}
sprintf(buffer,"%ld",c);
return buffer;
}
第一次的思路,是将两个字符串转化为int类型,转化为二进制,再通过sprintf转化为char类型
后来经过检查发现,是因为数字太大int会溢出而造成的问题
第二次
char* addBinary(char* a, char* b) {
int n, m;
n=strlen(a)-1;
m=strlen(b)-1;
char *p = (char*)malloc(m>n ? m+2 : n+2), *last = p;
int c = 0;
while (n || m || c) {
int s = c;
if (n) {
s += *(--a)-'0';
--n;
}
if (m) {
s += *(--b)-'0';
--m;
}
*last++ = (s&1)+'0';
c = s>>1;
}
*last=0;
char *start = p, t;
while (start+1 < last) { // reverse string
t = *start;
*start++=*(--last);
*last=t;
}
return p;
}
其中需要注意的一点是int类型的数据通过+’0’来转化为char类型 ,-‘0’来转化为int类型
总结:还是自己不够熟练,应该多敲多练习