Реализация BigInt.add ()? - PullRequest
       58

Реализация BigInt.add ()?

0 голосов
/ 18 февраля 2012

Я пытаюсь реализовать свою собственную версию метода add () из класса BigInteger.До сих пор он отлично работает, если ему дано два числа одинаковой длины, но не может скомпилироваться (индексировать за пределами), когда ему дано два числа различной длины.Каков наилучший способ решения этой проблемы?

Если это поможет, то при добавлении двух значений 10 и 1 выдается 20 *.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

Я бы попробовал что-то вроде этого:

   public BigInt add2( BigInt b )
   {
         int answerLength = Math.max( b.value.length, this.value.length ) + 1;
         int[] answer = new int[ answerLength ];

         BigInt bigger = this;
         BigInt smaller = b;
         if( this.lessThan( b ) )
         {
            bigger = b;
            smaller = this;
         }

         // copy the bigger value into answer
         for( int i = bigger.value.length - 1; i >= 0; i-- )
         {
            answer[ i + 1 ] = bigger.value[ i ];
         }

         // add the smaller into the answer
         int carry = 0;
         int lengthOffset = answerLength - smaller.value.length;
         for( int i = smaller.value.length - 1; i >= 0; i-- )
         {
            int result = answer[ i + lengthOffset ] + smaller.value[ i ] + carry;
            carry = result / 10;
            result %= 10;
            answer[ i ] = result;
         }
         answer[ 0 ] = carry;

         String ANSsz = convertArrayToString( answer );
         BigInt Sum = new BigInt( ANSsz );
         return Sum;
      }
0 голосов
/ 18 февраля 2012

Это действительно странное решение.Во-первых, у него есть очевидная проблема переполнения (результат двух добавленных целых чисел может не вписаться в сам int), и я понятия не имею, почему именно мы хотим разделить на 10 для простого сложения двух чиселэто действительно необходимо только для преобразования числа в десятичную строку.

В любом случае, просто подумайте, сколько цифр может иметь произведение двух чисел.Для простоты мы попробуем это в base10, но обобщение очевидно:

Длинное число из k цифр самое большее 10^k - 1 большое.Следовательно, если у нас есть число с n цифрами и одно с m, результат будет не более: 10^n - 1 + 10^m - 1 = 10^n + 10^m - 2.Наибольшее значение, которое мы можем получить, это если n == m, что эквивалентно 10 ^ n * 2 - 2, что явно меньше 10 ^ (n + 1).Это означает, что число имеет максимум на одну цифру больше, чем большее из двух (это также верно для основания 2).

0 голосов
/ 18 февраля 2012

Если я правильно понимаю ваш код, длина ans должна быть на единицу больше, чем большая из двух BigInt длин.Ваш ans только такой большой, как объект, к которому вызывается метод.

...