This code is much more complicated than it should be, which increases the likelihood of it finding errors that are difficult to detect.
You do not need to execute the algorithm 3 times (based on whether the first array is smaller, larger, or equal to the second array). You can implement it once for two arrays of the same size, the size of which is Math.max(arr1.length,arr2.length)
. This will eliminate 2/3 of your code.
int len = Math.max(arr1.length,arr2.length); int[] arr11 = new int[len]; int[] arr22 = new int[len]; int arr3[] = new int[len+1]; for(int i=len-1;i>=-1;i--) { if (i>=len-arr1.length) arr11[i]=arr1[i-(len-arr1.length)]; if (i>=len-arr2.length) arr22[i]=arr2[i-(len-arr2.length)];
In addition, instead of sum = arr1[i] + arr2[i];
I suggest you add the transfer immediately - sum = arr11[i] + arr22[i] + carry;
. Now you only need to check once if there is sum > 9
.
if(i==-1) { arr3[i+1] = carry; } else { sum = arr11[i] + arr22[i] + carry; if(sum>9) { arr3[i+1] = sum % 10; carry = 1; } else { arr3[i+1] = sum; carry = 0; } }
Combining the two fragments, you get:
int carry = 0; int sum = 0; int len = Math.max(arr1.length,arr2.length); int[] arr11 = new int[len]; int[] arr22 = new int[len]; int arr3[] = new int[len+1]; for(int i=len-1;i>=-1;i--) { if(i==-1) { arr3[i+1] = carry; } else { if (i>=len-arr1.length) arr11[i]=arr1[i-(len-arr1.length)]; if (i>=len-arr2.length) arr22[i]=arr2[i-(len-arr2.length)]; sum = arr11[i] + arr22[i] + carry; if(sum>9) { arr3[i+1] = sum % 10; carry = 1; } else { arr3[i+1] = sum; carry = 0; } } } return arr3;
EDIT:
I had a small mistake. I added 0s in the least significant digits of the smaller array (which are high indices) instead of the most significant bits (low indices), which made the result incorrect if the arrays had different lengths. I fixed it, although now the part that copies the elements from the source arrays to arr11
and arr22
is less readable.
source share