0

基数を取り、正または負の任意の整数乗にするメソッドを作成する必要があります。基数が 0 にならないことは想定できます。

メソッドでは、再帰メソッドを呼び出して使用する必要があります。

使用する必要がある以前の再帰的方法は次のとおりです。

 public static double nonNegInt(double base, int pow)
{
    if (pow == 0)
    return 1;
    else
     return base * nonNegInt(base,pow-1);   
}

だから私の質問は、誰かが私が必要とするメソッドを書く方法を教えてくれますか?

現在のメソッドが問題ないことはわかっていますが、別のメソッドで呼び出す必要があります。これを行うと、実行時エラーが発生します

4

3 に答える 3

1

あなたの方法は良い出発点ですが、要件に記載されているように負の指数を処理する必要があります。という事実を利用してくださいx^(-n) = 1.0 / x^n

于 2013-03-13T18:25:19.957 に答える
0

これは、負の値も処理する方法です。

public static double nonNegInt(double base, int pow)
{
    if (pow == 0)
        return 1;
    else if(pow < 0)
        return (1 / nonNegInt(base, -pow));
    else
        return base * nonNegInt(base,pow-1);   
}

それを実行する:

public static void main(String args[])
{
     double result = nonNegInt(4,-1);
     System.out.println(result);  //Will print 0.25
}

もちろん、負のケースを処理するようになったので、意味のある名前を付ける必要があります。

于 2013-03-13T18:28:16.463 に答える
0
public BigDecimal exp(BigDecimal base, BigInteger pow) {

    if(base == null || base.intValue() == 0 ) return BigDecimal.ZERO;

    BigInteger absPow = pow.abs();

    if(absPow.intValue() == 0) return  BigDecimal.ONE;

    if(absPow.intValue() == 1) return  pow.intValue() > 0 ? base :
                                            BigDecimal.ONE.divide(base, MathContext.DECIMAL128);

    if(absPow.intValue() == 2) return  pow.intValue() > 0 ? base.multiply(base):
                                            BigDecimal.ONE.divide(base.multiply(base), MathContext.DECIMAL128);

    BigInteger i = BigInteger.ONE;
    BigDecimal result = base;
    HashMap<BigInteger, BigDecimal> history = new HashMap<>();
    history.put(i, result);

    while (i.compareTo(absPow) < 0) {

        if(i.add(i).compareTo(absPow) <= 0) {

            i = i.add(i);
            result =  result.multiply(result);
            history.put(i, result);

        } else {

            BigInteger diff =  absPow.subtract(i);

            for (; diff.intValue() > 0 &&  !history.containsKey(diff); diff = diff.subtract(BigInteger.ONE));

            i = i.add(diff);
            result =  result.multiply(history.get(diff));
            history.put(i, result);
        }

    }


    return pow.intValue() > 0 ? result : BigDecimal.ONE.divide(result, MathContext.DECIMAL128);
}
于 2018-03-26T14:35:12.937 に答える