Java:如何将两个不同长度的数组的元素相加

时间:2013-11-17 08:42:44

标签: java arrays sum

我正在尝试将两个不同长度的数组的元素添加到一起。 下面的代码只是相同的长度,这是我到目前为止所有。

    //for the same lengths
int[]num1 = {1,9,9,9};
int[]num2 = {7,9,9,9};// {9,9,9}

    int total = 0, carry = 1;
    int capacity = Math.max(num1.length,num2.length);
    int []arraySum = new int [capacity];

        for (int i = capacity - 1 ; i >= 0; i--)
        {   
            arraySum[i] = num1[i]+ num2[i];

            if (arraySum[i] > 9)
            {
                arraySum[i] = arraySum[i] % 10;

                num2[i-1] = num2[i-1] + carry;  
            }


        }

    for(int i = 0; i < arraySum.length; i++)
    {
        System.out.print(arraySum[i]);
    }

如果我将num2和length的元素更改为{9,9,9},我该怎么办? 我知道我可能需要将另一个for循环作为内部for循环并控制数组的索引,但是长度较小但是如何....还有一件事......我应该为那些for循环条件做些什么,因为num1和num2最终会被用户输入。

嗯,你可以说输入是有限的,因为如果num1 [0] + num2 [0]&gt; 9进位没有放置索引,则无法编译。所以,我需要将整个数组移到右边,并将进位从num1 [0] + num2 [0]。这是问题!!我应该在哪里放置代码?我有点困惑.......

5 个答案:

答案 0 :(得分:2)

实际上它非常简单。在循环内部,检查当前索引是否对两个数组都有效,如果索引无效,则将值替换为0:

int value1 = (i < num1.length) ? num1[i] : 0;
int value2 = (i < num2.length) ? num2[i] : 0;
arraySum[i] = value1 + value2;

编辑:我不明白你想要对齐数组而不是左对齐它们。最简单的解决方案可能是以相反的顺序写入和读取数组中的所有内容。因此,如果数字是456和7658,则第一个数组将包含6,5,4,第二个数组将包含8,5,6,7。

答案 1 :(得分:1)

实际上,您声明一个容量为Math.max(num1.length, num2.length)的int []数组。

<强> It is not encough. You should set the capacity as Math.max(num1.length, num2.length) +1.

<强>为什么吗

查看num1是{1,9,9,9}还是num2是{9,9,9,9} arraySum如何表示总和{1,1,9,9,8}?

因此,我们需要将其声明如下,以考虑是否需要进位

 int[] arraySum = new int[capacity + 1];

然后在打印总和时,检查arraySum [0]是0还是1,如果它是0,则不要在控制台中打印。

修改后的参考代码如下:

包裹问题;

public class Example {

public static void main(String[] args) {

    // for the same lengths
    int[] num1 = { 1,9,9,9 };
    int[] num2 = { 9,9,9,9};// {9,9,9}

    // 1999+9999 = 11998, its length is greater than the max
    int capacity = Math.max(num1.length, num2.length);
    int[] arraySum = new int[capacity + 1];

    int len2 = num2.length;
    int len1 = num1.length;

    if (len1 < len2) {
        int lengthDiff = len2 - len1;

        /*
         * Flag for checking if carry is needed.
         */
        boolean needCarry = false;

        for (int i = len1 - 1; i >= 0; i--) {
            /**
             * Start with the biggest index
             */
            int sumPerPosition =0;

            if (needCarry) {
                 sumPerPosition = num1[i] + num2[i + lengthDiff] +1;
                 needCarry = false;
            }else
            {
                 sumPerPosition = num1[i] + num2[i + lengthDiff];
            }

            if (sumPerPosition > 9) {
                    arraySum[i + lengthDiff + 1] = sumPerPosition % 10;
                needCarry = true;
            }else
            {
                arraySum[i + lengthDiff + 1] = sumPerPosition % 10;
            }
        }

        /**
         * Handle the remaining part in nun2 Array
         */

        for (int i = lengthDiff - 1; i >= 0; i--) {
            /*
             * Do not need to care num1 Array Here now
             */

            if(needCarry){
                arraySum[i + 1] = num2[i]+1;
            }else
            {
                arraySum[i + 1] = num1[i] ;
            }

            if (arraySum[i + 1] > 9) {
                arraySum[i + 1] = arraySum[i + 1] % 10;
                needCarry = true;
            } else {
                needCarry = false;
            }


        }

        /*
         * Handle the last number, if carry is needed. set it to 1, else set
         * it to 0
         */
        if (needCarry) {
            arraySum[0] = 1;
        } else {
            arraySum[0] = 0;
        }

    } else {
        int lengthDiff = len1 - len2;

        /*
         * Flag for checking if carry is needed.
         */
        boolean needCarry = false;

        for (int i = len2 - 1; i >= 0; i--) {
            /**
             * Start with the biggest index
             */
            int sumPerPosition = 0;


            if (needCarry) {
                 sumPerPosition = num2[i] + num1[i + lengthDiff] +1;
                 needCarry = false;
            }else
            {
                 sumPerPosition = num2[i] + num1[i + lengthDiff];
            }

            if (sumPerPosition > 9) {
                    arraySum[i + lengthDiff + 1] = sumPerPosition % 10;
                needCarry = true;
            }else
            {
                arraySum[i + lengthDiff + 1] = sumPerPosition % 10;
            }
        }

        /**
         * Handle the remaining part in nun2 Array
         */

        for (int i = lengthDiff - 1; i >= 0; i--) {
            /*
             * Do not need to care num1 Array Here now
             */

            if(needCarry){
                arraySum[i + 1] = num1[i]+1;
            }else
            {
                arraySum[i + 1] = num1[i] ;
            }

            if (arraySum[i + 1] > 9) {
                arraySum[i + 1] = arraySum[i + 1] % 10;
                needCarry = true;
            } else {
                needCarry = false;
            }

        }

        /*
         * Handle the last number, if carry is needed. set it to 1, else set
         * it to 0
         */
        if (needCarry) {
            arraySum[0] = 1;
        } else {
            arraySum[0] = 0;
        }
    }

    /*
     * Print sum 
     * 
     * if arraySum[0] ==1, print 1
     * 
     * Do not print 0 when arraySum[0] ==0
     */
    if(arraySum[0] == 1)
    {
        System.out.print(1);
    }
    for (int i = 1; i < arraySum.length; i++) {

        System.out.print(arraySum[i]);
    }
}
}

num1为{1,9,9,9}且num2为{9,9,9,9}的示例,总和结果如下:

控制台

输出

11998

答案 2 :(得分:0)

以下是更多以绩效为中心的解决方案:

public class SumArrays {

    public static void main(String[] args) {

        int[] num1 = {1, 9, 9, 9};
        int[] num2 = {7, 9, 9, 9, 9, 9, 9};

        int[] biggerArray = num1.length > num2.length ? num1 : num2;
        int[] smallerArray = num1.length <= num2.length ? num1 : num2;

        int[] summedArray = new int[biggerArray.length];
        System.arraycopy(biggerArray, 0, summedArray, 0, biggerArray.length);

        for (int i = 0; i < smallerArray.length; i++) {
            summedArray[i] += smallerArray[i];
        }

        for (int i = 0; i < summedArray.length; i++) {
            System.out.println(summedArray[i]);
        }
    }
}

答案 3 :(得分:0)

您可以使用ArrayList代替数组,并对其实施常规添加方法:

public static ArrayList<Integer> sum(int[] arr, int[] arr2) {
    ArrayList<Integer> al = new ArrayList<>();
    int i = arr.length - 1;
    int j = arr2.length - 1;
    int c = 0;
    while (i >= 0 && j >= 0) {
        int temp = arr[i] + arr2[j] + c;
        if (temp >= 10) {
            int r = temp % 10;
            al.add(0, r);
            c = temp / 10;
        } else {
            al.add(0, temp);
            c = 0;
        }
        i--;
        j--;
    }
    if (i < 0 && j >= 0) {
        while (j >= 0) {
            al.add(0, arr2[j] + c);
            c = 0;
            j--;
        }
    } else if (j < 0 && i >= 0) {
        while (i >= 0) {
            al.add(0, arr[i] + c);
            c = 0;
            i--;
        }

    } else
        al.add(0, c);
    return al;
}

答案 4 :(得分:-1)

对于踢球,这里有另一种选择:

int[] num1 =
{ 1, 9, 9, 9 };
int[] num2 =
{ 7, 9, 9, 9 };

//convert the int array to a string
StringBuilder sb = new StringBuilder(num1.length);
for (int i : num1)
{
    sb.append(i);
}
String sNum1 = sb.toString();

System.out.println(sNum1);

StringBuilder sb2 = new StringBuilder(num2.length);
for (int i : num2)
{
    sb2.append(i);
}
String sNum2 = sb2.toString();

System.out.println(sNum2);

try
{
    //parse the string to an int
    int iNum1 = Integer.parseInt(sNum1);
    int iNum2 = Integer.parseInt(sNum2);

    //add them together
    int sum = iNum1 + iNum2;
    String sSum = Integer.toString(sum);

    System.out.println(sSum);

    // convert num back to array
    int[] sumArray = new int[sSum.length()];
    for (int i = 0; i < sSum.length(); i++)
    {
        sumArray[i] = sSum.charAt(i) - '0';
        System.out.println(sumArray[i]);
    }
}
catch (Exception e)
{
    // couldnt parse ints
}