Nowcoder java-数值的整数次方

Nowcoder java-数值的整数次方

(题目来自牛客网)
在这里插入图片描述

思路

整体分四种情况,代码中有详细解释。

方法一:方法一计算过程,乘方

方法二:方法二计算过程,分奇数偶数,时间复杂度O(logn):

1.右移一位操作就是代替除以2。
例如:对指数,比如是32次方,那么32除以2=16,16除以2=8…如果之前那算出来16次方的值,算32次方的时候直接平方前面算出来16次方的值就可以了。

2.位与运算代替余数运算,如果指数最后余1,就代表指数为奇数,那么结果最后还要在乘以一次底数。

运行过程大概是:
double res = getPower(base,absexponent >> 1); ①
例如:base= 2,exponent=16 调用①,先将16除以2 ,一直到指数为1,res= base=2,然后继续调用①,然后指数为2,res=4,判断指数为偶数,然后继续调用①,指数为4,res= 16,判断指数为偶数,然后继续调用①,指数为8,res= 256,判断指数为偶数,然后继续调用①,指数为16,res= 65536,结束程序。

问题:
double res = getPower(base,absexponent >> 1); ①
不明白①怎么就能再有将指数翻倍的功能呢?求解!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//分为4种情况
//1.base=0,exponent=0,可以为0或者1
//2.exponent<0
//3.exponent>0
//4.exponent=0
public class Power {
    public static double power(double base, int exponent) {
        if (equal(base, 0.0) && exponent < 0) {//1.base=0,exponent=0,可以为0或者1
            return 0.0;
        }


        if (exponent < 0) {//2.exponent<0
            int absexponent = -exponent;
            double res = getPower(base, absexponent);
            res = 1 / res;
            return res;
        } else if (exponent > 0) {//3.exponent>0
            int absexponent = exponent;
            return getPower(base, absexponent);
        } else {//4.exponent=0
            return 1.0;
        }
    }


//    private static double getPower(double base, double absexponent) {//方法一计算过程,乘方
//        double res = 1.0;
//        for (int i = 1; i <= absexponent; ++i) {
//            res *= base;
//        }
//        return res;
//    }
    private static double getPower(double base, int absexponent) {//方法二计算过程,分奇数偶数,时间复杂度O(logn)
        if(absexponent == 1){
            return base;
        }
        double res = getPower(base,absexponent >> 1);//右移运算,代表除以2
            res *= res;
            if((absexponent & 0x1) ==1){//位与运算代替求余运算
                res *= base;
                return res;
            }
        return res;
    }

    static boolean equal(double num1, double num2) { //用来消除误差,不能直接写base==0,因为计算机中0和0.0000001一样
        if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        double base = 2.0;
        int exponent = 16;
        System.out.println(power(base, exponent));
    }

}