/**
* 算法思想:
* 先用缓存将列加结果保存起来,其中可能包括>=2的数字;
* 将其中不等于1或者0的,进行进位换算;
* >= 2时,进位-1;
* 等于-1是,将本位置为1,高一位+1
*
*/
void reve(int *arr, int len){
int i=0, j=len-1;
while(i<j) {
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
i++;j--;
}
}
void print_arr(int *a, int len){
return;
int i=0;
for(i=0; i<len; i++)
printf("%4d,", a[i]);
printf("\n");
}
int* addNegabinary(int* arr1, int len1, int* arr2, int len2, int* returnSize){
int i = len1 - 1;
int j = len2 -1;
int flag = 0;
int *max_arr, *min_arr;
int max = len1 > len2 ? len1 : len2;
int min = len1 < len2 ? len1 : len2;
int *ret = (int *)malloc(sizeof(int) * (max+10));
int index = 0;
int tmp;
int len = 0;
memset(ret, 0, sizeof(int) * (max+10));
/* 先将累加结果记录下来 */
while(i>=0 || j>=0 || flag){
tmp = (i>=0 ? arr1[i] : 0) + (j>=0 ? arr2[j] : 0);
flag = 0;
ret[index++] = tmp;
j--;
i--;
}
/* 将其中不等于1或者0的,进行进位换算;
* >= 2时,进位-1;
* 等于-1是,将本位置为1,高一位+1
*/
for(i=0; i<max+10; i++){
print_arr(ret, max+10);
while(ret[i] != 0 && ret[i]!= 1){
if(ret[i] >= 2){
ret[i] -= 2;
ret[i+1] += -1;
}else if(ret[i] == -1){
ret[i] = 1;
ret[i+1] += 1;
}
}
}
/* 计算长度,从最高位开始,为0的都将len-- */
len = max+10;
for(i=max+10-1; i>=0; i--){
if(ret[i]){
break;
}
len--;
}
/* 将结果反转 */
reve(ret, len);
/* 判断是否为全0 */
int flag1 = 0;
for(i=0; i<index+10; i++){
if(ret[i]){
flag1 = 1;
}
}
/* 如果全部为0的话,将长度位置1 */
if(!flag1){
len = 1;
}
*returnSize = len;
return ret;
}
leetcode-5078-负二进制数相加-C语言
最新推荐文章于 2024-03-13 18:09:18 发布