0

我正在编写一个添加大数但不使用 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 两次来检查任一数组中是否还有任何数字。该方法运行良好,但这种尝试捕捉的东西看起来不太好。我可以用任何其他方式做到这一点吗?

4

3 回答 3

3

使用if语句来检查i< this.arr.length.

于 2013-01-12T11:20:41.527 回答
1

是的,有一种方法,您应该使用它而不是 try-catch 块。要检查 IndexOutOfBounds,只需检查索引是否超出范围,即它是否小于或等于数组大小。对此类检查进行尝试捕获绝对不是一个好主意。

由于您在特定的 try-catch 中有两个索引操作,因此您必须分别检查数组大小。

于 2013-01-12T11:22:11.773 回答
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);

顺便说一句,如果您carry在循环结束后有值,您的方法将无法正常工作,您还需要将此值附加到结果数组中。

于 2013-01-12T11:28:26.737 回答