Calculating powers of integers

前端 未结 16 1979
情书的邮戳
情书的邮戳 2020-12-08 06:18

Is there any other way in Java to calculate a power of an integer?

I use Math.pow(a, b) now, but it returns a double, and that is usually a

相关标签:
16条回答
  • 2020-12-08 06:40
    import java.util.Scanner;
    
    class Solution {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int t = sc.nextInt();
    
            for (int i = 0; i < t; i++) {
    
                try {
                    long x = sc.nextLong();
                    System.out.println(x + " can be fitted in:");
                    if (x >= -128 && x <= 127) {
                        System.out.println("* byte");
                    }
                    if (x >= -32768 && x <= 32767) {
                        //Complete the code
                        System.out.println("* short");
                        System.out.println("* int");
                        System.out.println("* long");
                    } else if (x >= -Math.pow(2, 31) && x <= Math.pow(2, 31) - 1) {
                        System.out.println("* int");
                        System.out.println("* long");
                    } else {
                        System.out.println("* long");
                    }
                } catch (Exception e) {
                    System.out.println(sc.next() + " can't be fitted anywhere.");
                }
    
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 06:42

    I managed to modify(boundaries, even check, negative nums check) Qx__ answer. Use at your own risk. 0^-1, 0^-2 etc.. returns 0.

    private static int pow(int x, int n) {
            if (n == 0)
                return 1;
            if (n == 1)
                return x;
            if (n < 0) { // always 1^xx = 1 && 2^-1 (=0.5 --> ~ 1 )
                if (x == 1 || (x == 2 && n == -1))
                    return 1;
                else
                    return 0;
            }
            if ((n & 1) == 0) { //is even 
                long num = pow(x * x, n / 2);
                if (num > Integer.MAX_VALUE) //check bounds
                    return Integer.MAX_VALUE; 
                return (int) num;
            } else {
                long num = x * pow(x * x, n / 2);
                if (num > Integer.MAX_VALUE) //check bounds
                    return Integer.MAX_VALUE;
                return (int) num;
            }
        }
    
    0 讨论(0)
  • 2020-12-08 06:43

    When it's power of 2. Take in mind, that you can use simple and fast shift expression 1 << exponent

    example:

    22 = 1 << 2 = (int) Math.pow(2, 2)
    210 = 1 << 10 = (int) Math.pow(2, 10)

    For larger exponents (over 31) use long instead

    232 = 1L << 32 = (long) Math.pow(2, 32)

    btw. in Kotlin you have shl instead of << so

    (java) 1L << 32 = 1L shl 32 (kotlin)

    0 讨论(0)
  • 2020-12-08 06:43

    Google Guava has math utilities for integers. IntMath

    0 讨论(0)
  • 2020-12-08 06:44

    A simple (no checks for overflow or for validity of arguments) implementation for the repeated-squaring algorithm for computing the power:

    /** Compute a**p, assume result fits in a 32-bit signed integer */ 
    int pow(int a, int p)
    {
        int res = 1;
        int i1 = 31 - Integer.numberOfLeadingZeros(p); // highest bit index
        for (int i = i1; i >= 0; --i) {
            res *= res;
            if ((p & (1<<i)) > 0)
                res *= a;
        }
        return res;
    }
    

    The time complexity is logarithmic to exponent p (i.e. linear to the number of bits required to represent p).

    0 讨论(0)
  • 2020-12-08 06:45

    There some issues with pow method:

    1. We can replace (y & 1) == 0; with y % 2 == 0
      bitwise operations always are faster.

    Your code always decrements y and performs extra multiplication, including the cases when y is even. It's better to put this part into else clause.

    public static long pow(long x, int y) {
            long result = 1;
            while (y > 0) {
                if ((y & 1) == 0) {
                    x *= x;
                    y >>>= 1;
                } else {
                    result *= x;
                    y--;
                }
            }
            return result;
        }
    
    0 讨论(0)
提交回复
热议问题