Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的非常大的数字-长加法_Java_Try Catch_Addition - Fatal编程技术网

Java中的非常大的数字-长加法

Java中的非常大的数字-长加法,java,try-catch,addition,Java,Try Catch,Addition,我正在编写一个程序,用于添加大数字,但不使用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;

我正在编写一个程序,用于添加大数字,但不使用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;
}
int l=this.arr.length>arg.arr.length?this.arr.length:arg.arr.length;
字节[]结果=新字节[l];
字节进位=0;
for(int i=0;i9){
结果[i]=(字节)(总和%10);
进位=1;
}
否则{
结果[i]=总和;
进位=0;
}
}
如果(进位>0){
字节[]tmp=新字节[l+1];
系统阵列副本(结果,0,tmp,0,l);
tmp[tmp.length-1]=进位;
结果=tmp;
}

所以为了添加两个数字,我使用try-catch两次来检查两个数组中是否还有剩余的数字。这个方法工作得很好,但是这个尝试捕捉的东西看起来不太好。我可以用其他方法来做这件事吗?

使用
if
语句来检查
I
是否
使用
if
语句来检查
I
是否
是的,有一种方法,应该使用它而不是try-catch块。要检查IndexOutOfBounds,只需检查索引是否超出范围,即是否小于或等于数组大小。为这样的检查做一次试捕绝对不是一个好主意


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

是的,有一种方法,你应该使用它,而不是用try-catch块。要检查IndexOutOfBounds,只需检查索引是否超出范围,即是否小于或等于数组大小。为这样的检查做一次试捕绝对不是一个好主意


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

当然,您需要将其重写如下:

    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);
if(i

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

当然,您需要按如下方式重写此值:

    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);
if(i

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

请不要使用异常来检查边界。当您有机会更改时,我会使用带有32位值的
int[]
(就像BigInteger一样),而不是带有小数的
字节[0]
。请不要使用异常来检查边界。当你有机会改变它时,我会使用带有32位值的
int[]
(就像BigInteger一样),而不是带有十进制的
byte[0]
。呃,解决方案是如此简单,我简直不敢相信我没有想到。谢谢。呃,这个解决方案太简单了,我简直不敢相信我居然没有想到。谢谢