实现BigInt.add()?

时间:2012-02-18 03:20:13

标签: java implementation biginteger bigint indexoutofboundsexception

我正在尝试从BigInteger类实现我自己的add()方法版本。到目前为止,当给定两个相同长度的数字时,它完美地工作,但是当给定两个不同长度的数量时,它无法编译(索引越界)。什么是解决这个问题的最佳方法?

如果有帮助,当添加的两个值为10时,输出为20。

    public BigInt add(BigInt b) {
        int[] ans = new int[value.length];
        int carry=0;

        if(this.lessThan(b))
                for(int i=b.value.length-1;i>=0;i--){
                        int result=this.value[i]+b.value[i]+carry;
                        carry=result/10;
                        result%=10;
                        ans[i]=result;
                }
        else
                for(int i=this.value.length-1;i>=0;i--){
                        int result=this.value[i]+b.value[i]+carry;
                        carry=result/10;
                        result%=10;
                        ans[i]=result;
                }

        String ANSsz=convertArrayToString(ans);
        BigInt Sum = new BigInt(ANSsz);
        return Sum;
    }

3 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码,ans长度必须大于两个BigInt长度中的较大者。您的ans只能与调用该方法的对象一样大。

答案 1 :(得分:0)

我会尝试这样的事情:

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

答案 2 :(得分:0)

这真是一个非常奇怪的解决方案。首先它有明显的溢出问题(两个添加的int的结果可能不适合int本身)并且我不知道为什么我们想要除以10除以简单的2个数字 - 这实际上只是将数字转换为十进制字符串所必需的。

无论如何只要考虑两个数字的乘积可以有多少位数。为简单起见,我们在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)。