2016-05-10 16 views
0

私は自分のBigIntegerクラスを実装しようとしています。ここで、BigIntはListであり、各要素はその数字の1桁です。再帰を介して2つのBigIntを互いに追加するためにplus()メソッドを実装しようとしています。カスタムBigIntegerクラスの再帰的な追加

私はadd()に問題がありますが、この場合にgetメソッドを実装する方法がわかりません。

public BigInt plus(BigInt operand){ 
    List<Integer> a = this.getDigit(); 
    List<Integer> b = operand.getDigit(); 
    List<Integer> sum = new ArrayList<>(); 

    if(a.size() > b.size()){ 
     sum = add(a,b,0,sum); 
    } else { 
     sum = add(b,a,0,sum); 
    } 
    return new BigInt(sum); 
} 

private List<Integer> add(List<Integer> x, List<Integer> y, final int carry, List<Integer> result){ 
    int sum; 
    int c = carry; 
    //if block is base case? 
    if(y.size() == 1){ 
     sum = getSum(x,y,carry); 
     c = getCarry(result, sum); 

     if(sum>=10){ 
      sum = (x.get(x.size()-1) + c); 
      x.remove(x.size()-1); 
      x.add(sum); 
     } 
     for(int i = x.size()-1; i >= 0; i--){ 

      result.add(0,x.get(i)); 
     } 
     return result; 
    } 

    //recursive case? 
    sum = getSum(x,y,carry); 
    c = getCarry(result,sum); 

    return this.add(x,y,c,result); 
} 

public int getSum(List<Integer> x, List<Integer> y, final int carry){ 
    return 0;//PLACEHOLDER 
} 
public int getCarry(List<Integer> result, int sum){ 
    return 0;//PLACEHOLDER 
} 

と私のコンストラクタ

private BigInt(List<Integer> b){ 
    this.digit = new ArrayList<>(); 
    this.digit.addAll(b); 

} 
private BigInt(String str){ 
    this.digit = new ArrayList<>(); 
    String[] s = str.split(""); 
    List<String> list = new ArrayList<>(Arrays.asList(s)); 
    for(int i = 0; i < list.size(); i++){ 
     int b = Integer.valueOf(list.get(i)); 
     this.digit.add(b); 
    } 
} 
+1

再帰を使用する必要がありますか?これは "BigInteger"オブジェクトを実装するために非常に複雑に思えます。 – Jared

+0

@ Jaredが正しいです。あなたはかなり複雑なものにこれをやや単純な問題にしています。 getThisとgetThatを呼び出さないでください。 2つのループを使用するだけです.1つは配列が重なったとき、もう1つは長い配列の残りのものです。次の3 + 8(キャリー+1)= 12のように、ストア2とキャリー1などを追加するだけで、9 + 7 = 16を追加してください。新しい桁上げがあればそれを運び、確立する。あなたがやっていることはあまりに複雑すぎて複雑すぎます。 –

+0

ありがとう@RudyVelthuis私は今夜それをテストします。私は、再帰に関する理解の欠如が、なぜ私がそれをオーバーコンプリートしているのかと考えています(ここでは再帰を実装することがプロジェクトのポイントです)。 getSumとgetCarryのアイデアは、コードを読みやすくするために少しだけモジュレーションすることでした。 – Alkarin

答えて

1

あなたがタイプミスを持っているように見えます。 int x = x.size()-1int i = x.size()-1に変更してみてください。

また、i++で無限にループします。 i--を意味しましたか?

+0

ああありがとう、私はそれらのいずれかを見ていないためのダンシーのように感じる。編集された投稿。 – Alkarin

関連する問題