Java中的非常大的数字-长加法
我正在编写一个程序,用于添加大数字,但不使用BigInteger。不过我还有一个问题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;
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]
。呃,解决方案是如此简单,我简直不敢相信我没有想到。谢谢。呃,这个解决方案太简单了,我简直不敢相信我居然没有想到。谢谢