负二进制数相加

文章讲述了如何实现负二进制数的相加操作,通过理解负二进制的进位规则,避免转换为十进制,直接在二进制数组上进行计算。在过程中,遇到sum大于2或等于-1的情况时调整进位标志c,并更新数组。最后,清除多余的0并翻转数组得到结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、1073. 负二进制数相加

 思路

这个题其实要明白这个二进制的转换,就可以做出来了,我刚开始想的是直接转换成十进制,然后最后再相加起来,然后再转成二进制,这样最开始做的话我也不知道怎么错了,因为力扣这个不好测试嘛,所以就去看了题解,那么题解是这样说的

我们将俩个数组相加,满足sum = a + b + c ,c是进位标志,会得到以下数据:1 , 2 , 0 

而当sum = 2的时候我们就好向前减一,那么就c = -1,而当sum = -1时,c = 1,sum = 1;

而sum=1或者0的时候就不变

那么明白这个道理之后就不用,就可以代码实现了

代码实现

void fun(int *x,int left,int right)
{
    while(left<right)
    {
        int t=x[left];
        x[left]=x[right];
        x[right]=t;
        left++;
        right--;
    }
}

int* addNegabinary(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize){
    int *x=(int*)calloc(arr1Size+arr2Size+1,sizeof(int));
    int n=arr1Size-1,m=arr2Size-1;
    int k=0,c=0,sum,a,b;
    while(n>=0||m>=0||c)
    {
        a = n < 0 ? 0 : arr1[n];    //防止数组溢出
        b = m < 0 ? 0 : arr2[m];
        sum=a+b+c;
        if(sum>=2)        //列举情况
        {
            c=-1;
            sum-=2;
        }
        else if(sum==-1)
        {
            c=1;
            sum=1;
        }
        else {
            c=0;
        }
        n--;
        m--;
        x[k++]=sum;
    }
    while(k>1&&x[k-1]==0){          //清除多余的0
        k--;
    }
    *returnSize=k;
    fun(x,0,k-1);        //数组翻转
    return x;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值