1. 程式人生 > >演算法導論2.1-4 考慮n位二進位制整數相加起來的問題

演算法導論2.1-4 考慮n位二進位制整數相加起來的問題

考慮把兩個n位二進位制整數加起來的問題,這兩個整數分別儲存在兩個n元陣列A和B中。這兩個整數的和應按二進位制形式儲存在一個(n+1)元陣列C中。

使用java程式碼實現;實現程式碼如下:

引數A和B為相同長度n的整形陣列,該函式返回一個長度為n+1的陣列

    private static int[] BinaryAdd(int[] A,int[] B)
    {
        int flag=0;
        int[] C=new int[A.length+1];
        int i=0;
        for(i=A.length-1;i>=0;i--)
        {
            if((A[i]+B[i]+flag)>1)
            {
                C[i+1]=(A[i]+B[i]+flag)%2;
                flag=1;
            }
            else
            {
                C[i+1]=A[i]+B[i]+flag;
                flag=0;
            }
        }
        C[0]=flag;
        return C;
    }

拓展:如何實現兩個不限制長度的二進位制陣列相加並的出正確結果??

實現程式碼如下,程式碼有待優化:

private static int[] BinaryMultiAdd(int[] A,int[] B)
    {
        //返回陣列長度為A、B中長度較長的陣列+1
        int[] C={};

        int flag=0;
        if(A.length>B.length)
        {
            C=new int[A.length+1];
            for(int i=A.length-1;i>=0;i--)
            {

                if(A.length-i<=B.length)
                {
                    if((A[i]+B[B.length-A.length+i]+flag)>1)
                    {
                        C[i+1]=(A[i]+B[B.length-A.length+i]+flag)%2;
                        flag=1;
                    }
                    else
                    {
                        C[i+1]=A[i]+B[B.length-A.length+i]+flag;
                        flag=0;
                    }
                }
                else
                {
                    if((A[i]+flag)>1)
                    {
                        C[i+1]=(A[i]+flag)%2;
                        flag=1;
                    }
                    else
                    {
                        C[i+1]=A[i]+flag;
                        flag=0;
                    }

                }
            }
            C[0]=flag;
        }
        else
        {
            C=new  int[B.length+1];
            for(int i=B.length-1;i>=0;i--)
            {
                if(B.length-i<=A.length)
                {
                    if((B[i]+A[A.length-B.length+i]+flag)>1)
                    {
                        C[i+1]=(B[i]+A[A.length-B.length+i]+flag)%2;
                        flag=1;
                    }
                    else
                    {
                        C[i+1]=B[i]+A[A.length-B.length+i]+flag;
                        flag=0;
                    }
                }
                else
                {
                    if((B[i]+flag)>1)
                    {
                        C[i+1]=(B[i]+flag)%2;
                        flag=1;
                    }
                    else
                    {
                        C[i+1]=B[i]+flag;
                        flag=0;
                    }
                }
            }
            C[0]=flag;
        }
        return C;
    }