0

BigInteger クラスから独自のバージョンの add() メソッドを実装しようとしています。これまでのところ、同じ長さの 2 つの数値を指定すると完全に機能しますが、長さが異なる 2 つの数値を指定するとコンパイルに失敗します (範囲外のインデックス)。この問題を解決する最善の方法は何でしょうか?

それが役立つ場合、加算される 2 つの値が 10 と 1 のときの出力は 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;
    }
4

3 に答える 3

0

それは本当に非常に奇妙な解決策です。まず第一に、明らかなオーバーフローの問題があり (2 つの int を加算した結果が int 自体に収まらない可能性があります)、2 つの数値を単純に加算するために 10 で除算する必要がある理由がわかりません。これは、数値を 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 つのうちの大きい方の数字よりも多くても 1 桁多いことを意味します (これは基数 2 にも当てはまります)。

于 2012-02-18T04:44:14.363 に答える
0

私があなたのコードを正しく理解していれば、ans長さは 2 つの長さのうち大きい方より 1 大きい必要がありますBigInt。あなたansは、メソッドが呼び出されているオブジェクトと同じ大きさです。

于 2012-02-18T03:58:48.577 に答える
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;
      }
于 2012-02-18T04:18:59.887 に答える