私は自分の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);
}
}
再帰を使用する必要がありますか?これは "BigInteger"オブジェクトを実装するために非常に複雑に思えます。 – Jared
@ Jaredが正しいです。あなたはかなり複雑なものにこれをやや単純な問題にしています。 getThisとgetThatを呼び出さないでください。 2つのループを使用するだけです.1つは配列が重なったとき、もう1つは長い配列の残りのものです。次の3 + 8(キャリー+1)= 12のように、ストア2とキャリー1などを追加するだけで、9 + 7 = 16を追加してください。新しい桁上げがあればそれを運び、確立する。あなたがやっていることはあまりに複雑すぎて複雑すぎます。 –
ありがとう@RudyVelthuis私は今夜それをテストします。私は、再帰に関する理解の欠如が、なぜ私がそれをオーバーコンプリートしているのかと考えています(ここでは再帰を実装することがプロジェクトのポイントです)。 getSumとgetCarryのアイデアは、コードを読みやすくするために少しだけモジュレーションすることでした。 – Alkarin