web-dev-qa-db-ja.com

javaのmath.powを使用せずに指数を取得する方法

これは私のプログラムです

// ************************************************************
    // PowersOf2.Java
    //
    // Print out as many powers of 2 as the user requests
    //
    // ************************************************************

    import Java.util.Scanner;

    public class PowersOf2 {

    public static void main(String[] args)

    {
        int numPowersOf2; //How many powers of 2 to compute
        int nextPowerOf2 = 1; //Current power of 2
        int exponent= 1;
        double x;

         //Exponent for current power of 2 -- this
        //also serves as a counter for the loop Scanner

        Scanner scan = new Scanner(System.in);
        System.out.println("How many powers of 2 would you like printed?");
        numPowersOf2 = scan.nextInt();
        System.out.println ("There will be " + numPowersOf2 + " powers of 2 printed");
        //initialize exponent -- the first thing printed is 2 to the what?

    while( exponent <= numPowersOf2)
        {
        double x1 = Math.pow(2, exponent);
        System.out.println("2^" + exponent + " = " + x1);
                exponent++;
        }   
//print out current power of 2
//find next power of 2 -- how do you get this from the last one?
//increment exponent

    }
}

問題は、math.powメソッドの使用が許可されていないことです。whileループで正しい答えを得る別の方法を見つける必要があります。

5
user3552056

2のべき乗は、単純に ビットシフト演算子 で計算できます。

int exponent = ...
int powerOf2 = 1 << exponent;

より一般的な形式であっても、「n回乗算」して指数を計算する必要があります。代わりに、次のようにすることができます 二乗による累乗

11
Marco13

独自のpower関数を実装できます。

power関数の複雑さは、要件と制約によって異なります。たとえば、指数を正の整数のみに制限できます。

power関数の例を次に示します。

public static double power(double base, int exponent) {
    double ans = 1;
    if (exponent != 0) {
        int absExponent = exponent > 0 ? exponent : (-1) * exponent;
        for (int i = 1; i <= absExponent; i++) {
            ans *= base;
        }

        if (exponent < 0) {
            // For negative exponent, must invert
            ans = 1.0 / ans;
        }
    } else {
        // exponent is 0
        ans = 1;
    }

    return ans;
}
1
wns349

これに基づいてこれを試すことができます 説明

 public double myPow(double x, int n) {

    if(n < 0) {
        if(n == Integer.MIN_VALUE) {
            n = (n+1)*(-1);
            return 1.0/(myPow(x*x, n));
        }
        n = n*(-1);
        return (double)1.0/myPow(x, n);
    }
    double y = 1;
    while(n > 0) {
        if(n%2 == 0) {
           x = x*x; 
        }
        else {
            y = y*x;
            x = x*x;
        }
         n = n/2;
    }
    return y;   
}
1
Pritam Banerjee

「myPow(x、n)」を使用せずに、「while」を使用して管理する方法を次に示します。 (私はJavaを2週間だけ学んできたので、コードが少しゴツゴツしている場合は失礼します:)

    String base ="";
    String exp ="";
    BufferedReader value = new BufferedReader (new InputStreamReader(System.in));
    try {System.out.print("enter the base number: ");
        base = value.readLine();
        System.out.print("enter the exponent: ");
        exp = value.readLine(); }
    catch(IOException e){System.out.print("error");}

    int x = Integer.valueOf(base);
    int n = Integer.valueOf(exp);
    int y=x;
    int m=1;       
    while(m<n+1) {
        System.out.println(x+"^"+m+"= "+y);
        y=y*x;
        m++;    
    }
0
AVos

私はこの答えが非常に遅いことを知っていますが、基数と指数を格納する変数を持つことが許可されている場合に使用できる非常に単純な解決策があります。

public class trythis {
    public static void main(String[] args) {
        int b = 2;
        int p = 5;
        int r = 1;
        for (int i = 1; i <= p; i++) {
            r *= b;
        }
        System.out.println(r);
    }
}

これは、正と負のベースでは機能しますが、負のパワーでは機能しません。

0
Artemis Hunter
// Set the variables

int numPowersOf2;        //How many powers of 2 to compute
int nextPowerOf2 = 1;    //Current power of  2
int exponent = 0;  


/* User input here */

// Loop and print results

do
   {

    System.out.println ("2^" + exponent + " = " + nextPowerOf2);

    nextPowerOf2 = nextPowerOf2*2;

    exponent ++;
  } 
while (exponent < numPowersOf2);
0
noob.coder

次の簡単なコードを試してください:

public static int exponent(int base, int power) {
   int answer = 1;

   for(int i = 0; i < power; i++) {
      answer *= base;
   }

   return answer;
}
0
Code Zinx

ループの使用に関するコメントが欲望であるか要件であるかは不明です。それが単なる望みである場合、_Math.Pow_に依存しない、使用できる数学IDがあります。

xy = ey∙ln(x)

Javaこれは次のようになります

_public static double myPow(double x, double y){
  return Math.exp(y*Math.log(x));
}
_

本当にループが必要な場合は、次のようなものを使用できます

_public static double myPow(double b, int e) {
  if (e < 0) {
    b = 1 / b;
    e = -e;
  }

  double pow = 1.0;
  double intermediate = b;
  boolean fin = false;

  while (e != 0) {
    if (e % 2 == 0) {
      intermediate *= intermediate;
      fin = true;
    } else {
      pow *= intermediate;
      intermediate = b;
      fin = false;
    }
    e >>= 1;
  }

  return pow * (fin ? intermediate : 1.0);
}
_
0
andand

パフォーマンスの制約がない場合は、次のことができます。

double x1=1;

for(int i=1;i<=numPowersOf2;i++){
   x1 =* 2
}
0
tutak

これは、負の値と正の値の両方の計算を可能にする投稿です。

https://stackoverflow.com/a/23003962/3538289

+/-指数をO(log(n))複雑度で処理する関数。

double power(double x, int n){
 if(n==0)
  return 1;

  if(n<0){
      x = 1.0/x;
      n = -n;
  }
 double ret = power(x,n/2);
 ret = ret * ret;
 if(n%2!=0)
   ret = ret * x;
 return ret;
}
0
cevaris

組み込みのMath.pow()を使用せずにpow関数を実装するには、以下の再帰的な方法を使用して実装できます。ランタイムを最適化するために、power(a、b/2)の結果を保存し、偶数または奇数の回数に応じて再利用できます。

static float power(float a, int b)
{
    float temp;
    if( b == 0)
        return 1;
    temp = power(a, b/2); 

    // if even times
    if (b%2 == 0)
        return temp*temp;
    else  // if odd times
    {
        if(b > 0)
            return a * temp * temp;
        else  // if negetive i.e. 3 ^ (-2)
            return (temp * temp) / a;
    }
} 
0
mpatel

Math.pow()を使用せずに指数値を取得するには、ループを使用できます。カウントがb(パワー)未満である限り、ループには「* a」が追加されます。数学的には、Math.pow()と同じです

while (count <=b){
    a= a* a;
}
0
Chen Jin