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;
}

したがって、2 つの数値を追加するには、try-catch を 2 回使用して、いずれかの配列に数字が残っているかどうかを確認します。メソッドは正常に機能していますが、この try-catch は見栄えがよくありません。他の方法でこれを行うことはできますか?

4

3 に答える 3

3

ステートメントを使用して、であるifことを確認しiます< this.arr.length

于 2013-01-12T11:20:41.527 に答える
1

はい、方法があり、try-catch ブロックの代わりに使用する必要があります。IndexOutOfBounds をチェックするには、単にインデックスが範囲外かどうか、つまり配列サイズ以下かどうかをチェックします。このようなチェックのために try catch を実行することは、明らかに良い考えではありません。

特定の try-catch に 2 つのインデックス操作があるため、配列のサイズを個別に確認する必要があります。

于 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 に答える