我正在编写一个程序,用于添加大数字但不使用BigInteger。我有一个长期添加的问题。
int l = this.arr.length > arg.arr.length ? this.arr.length : arg.arr.length;
byte[] result = new byte[l];
byte carry = 0;
for(int i = 0; i < result.length; i++){
byte sum;
try{
sum = (byte) (this.arr[i] + arg.arr[i] + carry);
}
catch(ArrayIndexOutOfBoundsException e){
try{
sum = (byte) (this.arr[i] + carry);
}
catch(ArrayIndexOutOfBoundsException ex){
sum = (byte) (arg.arr[i] + carry);
}
}
//carry
if(sum > 9){
result[i] = (byte) (sum % 10);
carry = 1;
}
else{
result[i] = sum;
carry = 0;
}
}
if(carry > 0){
byte[] tmp = new byte[l+1];
System.arraycopy(result, 0, tmp, 0, l);
tmp[tmp.length - 1] = carry;
result = tmp;
}
所以要添加两个数字,我正在使用try-catch两次来检查是否有任何数组中的任何数字。该方法工作正常,但这个try-catch事情看起来不那么好。我可以用其他方式做到这一点吗?
答案 0 :(得分:3)
使用if
语句检查i
是<
this.arr.length
。
答案 1 :(得分:1)
是的,有一种方法,你应该使用它而不是try-catch块。要检查IndexOutOfBounds,只需检查索引是否超出范围,即它是否小于或等于数组大小。尝试捕获这样的检查肯定不是一个好主意。
由于在特定的try-catch中有两个索引操作,因此必须分别检查数组大小。
答案 2 :(得分:1)
当然你需要按如下方式重写:
if(i < this.arr.length && i < arg.arr.length)
sum = (byte) (this.arr[i] + arg.arr[i] + carry);
else if(i < this.arr.length)
sum = (byte) (this.arr[i] + carry);
else
sum = (byte) (arg.arr[i] + carry);
BTW,如果在循环结束后carry
中有值,则您的方法将无法正常工作,您还需要将此值附加到结果数组。