2013-01-12 4 views
0

Я пишу программу для добавления больших чисел, но без использования BigInteger. Однако у меня проблема с длинным дополнением.Очень большие числа в Java - длинное дополнение

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-улов в два раза, чтобы проверить, есть ли какие-либо цифры остаются в одном из массивов. Метод работает отлично, но эта вещь-попытка не выглядит такой приятной. Могу ли я сделать это любым другим способом?

+1

Пожалуйста, не используйте исключения для проверки границ. Я бы использовал 'int []' с 32-битными значениями (как и BigInteger) вместо 'byte [0]' с десятичной запятой, когда вы получили возможность изменить его. –

ответ

3

Используйте заявление if, чтобы проверить, что i является <this.arr.length.

+1

Ух, решение было настолько простым, что я не могу поверить, что это не перешло мне в голову. Благодарю. – Neutrino

1

Да, есть способ, и вы должны использовать вместо блока try-catch. Чтобы проверить IndexOutOfBounds, просто проверьте, не затенен ли индекс, т. Е. Если он меньше или равен размеру массива. Делая попытку поймать такие проверки, определенно не очень хорошая идея.

Поскольку у вас есть две операции индекса в конкретном try-catch, вам придется отдельно проверять размеры массива.

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 после цикла закончится, вам нужно добавить это значение привести массив также.