1

私はこのコードをじっと見つめていましたが、何が問題なのかわかりません。新鮮な目が助けになるかもしれません。

public static BigInteger powerOfBigInteger (BigInteger base, BigInteger power){
    if (power == BigInteger.valueOf(0)){
        return BigInteger.valueOf(1);
    }

    if (power == BigInteger.valueOf(1)){
        return base;
    }

    BigInteger x = BigInteger.valueOf(1);
    while (x != power ){
        base.multiply(base);
        x.add(BigInteger.valueOf(1));
        System.out.println(x + " " + power);
                   return base;
    } 

    return base;

私はこれを実行しましたが、どうやら x が電力に等しくなることはありません。どんな助けでも大歓迎です。

4

4 に答える 4

5

やったほうがいい

if (BigInteger.ZERO.equals(power)) return BigInteger.ONE;
if (BigInteger.ONE.equals(power))  return base;

BigInteger は不変であり、新しい BigInteger インスタンスを返すため、乗算と加算の結果を累積する必要があります

無限ループは、あなたの x が決して変わらないためです- あるべきです

x = x.add(BigInteger.ONE);

乗算はに変更する必要があります

result = result.mulitply(base);

ここで、初期結果値は BigInteger.ONE にする必要があります

于 2012-06-14T01:20:01.393 に答える
1

私が見る 1 つのことは、.equals の代わりに == を使用して比較していることです。オブジェクトを equals で比較します。

public static BigInteger powerOfBigInteger (BigInteger base, BigInteger power){
    if (power.equals(BigInteger.valueOf(0))){
        return BigInteger.valueOf(1);
    }

    if (power.equals(BigInteger.valueOf(1))){
        return base;
    }

    BigInteger x = BigInteger.valueOf(1);
    while (!x.equals(power)){
        base.multiply(base);
        x.add(BigInteger.valueOf(1));
        System.out.println(x + " " + power);
                   return base;
    } 

    return base;
}
于 2012-06-14T01:19:09.907 に答える
1

で使用==しているようですBigInteger。これをしないでください。.equals(other)代わりに使用してください。BigInteger通常の演算子と比較できるプリミティブではありません(オブジェクト参照を比較しているだけで、おそらく等しくないでしょう)。BigIntegerまた、インスタンスで計算を実行するときに何も設定していません。ローカル オブジェクトを操作せず、結果をローカル オブジェクトに格納します。返されたオブジェクトを保存する必要があります。

問題のある行:

  • base.multiply(base);
  • x.add(BigInteger.valueOf(1));

SO re に関するこの他の投稿にもいくつかの議論があります。BigIntegerの累乗BigInteger: BigInteger.pow(BigInteger)?

于 2012-06-14T01:20:04.437 に答える