首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在添加索引为-2的整数

正在添加索引为-2的整数
EN

Stack Overflow用户
提问于 2013-05-30 01:09:53
回答 2查看 196关注 0票数 0

我经历了一次面试,我被要求添加2个带有-2索引的整数,即第i位的(-2)幂i。我给出了以下答案,但被告知这个答案是不有效和错误的。我不同意这种低效的评论,但可能会同意这种不正确的说法。

我加法的方式是,如果2位的和大于等于2,则进位为-1,因为相邻的位具有相反的符号。如果加2位是-1,我将其设为1,并对相邻的位进位为1。

有没有人看到代码有什么问题?

代码语言:javascript
复制
struct Results solution ( int A[], int M, int B[], int N ) {
    struct Results result;

    int min =M;
    int max = M;

    int i=0;
    int sum;
    int carry = 0;

    if(N<M)min = N;
    if(N>M)max = N;

    result.C = (int*) malloc(sizeof(int) * max);

    for(i=0;i<min;i++){
        sum = A[i] +  B[i] + carry;
        if(sum >= 2 ){
            if(carry == 0 ) 
                carry = -1;
            else 
                carry = -carry;
            sum = sum-2;
        }
        else if(sum == -1){
            sum = 1;
            carry = 1;  
        }
        else{
            carry=0;
        }
        result.C[i] = sum;
    }

    if( M > N){
        result.L = M;
        for(i=N;i<M;i++){
            sum = A[i]+carry;
            if(sum >= 2 ){
                if(carry == 0 ) carry = -1;
                else carry = 1;
                sum = sum-2;
            }
            else if(sum == -1){
                sum = 1;
                carry = - carry;  
            }
            else{carry=0;}
            result.C[i] = sum;
        }
    }

    if( N > M){
        result.L = N;
        for(i=M;i<N;i++){
            sum = B[i]+carry;
            if(sum >= 2 ){
                if(carry == 0 ) carry = -1;
                else carry = -carry;
                sum = sum-2;
            }
            else if(sum == -1){
                sum = 1;
                carry = 1;  
            }
            else{carry=0;}
            result.C[i] = sum;
        }
    }

    return result;
}

int main(int argc, char* argv[])
{
    int A[]  = {0,1,1,0,0,1,0,1,1,1,0,1,0,1,1};
    int B[]  = {0,0,1,0,0,1,1,1,1,1,0,1};
    solution (A,15,B ,12 );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-30 02:18:47

问题1

你说如果2比特的和大于等于2,你使用进位为-1的,但在你的其中一种情况下,你有代码:

代码语言:javascript
复制
        if(sum >= 2 ){
            if(carry == 0 ) carry = -1;
            else carry = 1;
            sum = sum-2;
        }

这会将进位设置为1,而不是-1。

您还可以争辩说,这段代码可以更有效地编写为:

代码语言:javascript
复制
        if(sum >= 2 ){
            carry = -1;
            sum = sum-2;
        }

问题2

如果添加{1}和{1},会发生什么情况?您将返回长度1和结果{0},但答案应为{0,1,1}。(1+1=-2+4)换句话说,您可能需要返回比最大输入更多的位。

票数 1
EN

Stack Overflow用户

发布于 2013-05-30 02:30:05

O(1)解决方案:表查找。

如果你知道每个输入的位数,那么2D查找表就能很快地做到这一点。如果没有,您仍然可以使用它一次做一堆比特。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16820024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档