剑指offer——数值的n次方

题目:
实现函数double Power(double base, int exponent),求base的exponent次方。
不得使用库函数,同时不需要考虑大数问题。
/*
* 实现函数double Power(double base, int exponent),求base的exponent次方。
* 不得使用库函数,同时不需要考虑大数问题。
*
* 【注意】
* – 底数(base)是0且指数(exponent)是负数时的,throw new RuntimeException(“参数异常”)
* – 0的0次方,无意义.任何数的0次方都 return 1;
* – 任何数的1次方 都等于他本身,return base;
* – 判断两个小数相等:由于计算机在表示小数时(包括float和double型的小数)都有误差,所以只要两数之差的绝对值在一个很小的范围内,
* (小于0.0000001),就可以认为两数相等了!
* – 下面开始求a的n次方:
* n为偶数时,a^n = a^(n/2) * a^(n/2);
* n为奇数时,a^n = a^((n-1)/2) * a^((n-1)/2) * a
*
* 判断奇偶的两种方法:
* 方法一:求余 %
* if(x%2) 奇数
* else 偶数
* 根据奇数偶数的定义,若整数除以2没有余数,则为偶数,否则为奇数。因此,偶数取余结果为0,奇数取余结果为非零
* 在if(条件)判断中,若条件为非零,表示条件成立,否则表示条件不成立(即不执行if()之后的语句)
*
* 方法二:与1相与 &1
* if(x&1) 奇数
* else 偶数
* 按位与运算&的使用方法 按位与运算 a&b
* 参与运算的两数各对应的二进位相与,只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
* 例如:9&5可写算式如下:
* 先分别将两个数化为二进制,在进行运算
* 00001001 (9的二进制补码)
* & 00000101 (5的二进制补码) 
* —————
* 00000001 (1的二进制补码)
* 可见9&5=1。
*
* 对于任何一个数 x & 1,因为1的二进制是1,在它的补码中,除了最后一位为1,其它全部为0,
* 前面提到,按位与运算&只有当两个数都为1时结果才是1,因此,任何一个数与1相与,只有最低位可能为1,
* 因此最终的结果只有0和1两种情况,而且结果取决于另外那个数二进制中的最后一位(若为1,最终结果便为1,若为0,结果便是0)
*
* 从二进制化为十进制中,需要加上二进制中最低位乘以2的零次方(1*2^0或0*2^0),
* 然后再加上 对应位乘以 2^1,2^2,2^3,2 ^4……但是之后这一些都数2的倍数,也就是都是偶数,
* 要让这些偶数变成奇数,取决于 2^0这一项,即,一个十进制数字是奇数还是偶数,取决于二进制中最低位那个数是0还是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
62
63
64
65
66
67
68
public class 数值的n次方 {
    public static double numpow1(double num,int pow) {
        if(num == 0 && pow <= 0) {
            return -1;
        }
        double max=1;
        if(pow > 0) {
            max = pow(num,pow);
            return max;
        }else if(pow < 0) {
            pow = -pow;
            max = pow(num,pow);
            return 1/max;
        }else {
            return 1;
        }
    }
    public static double numpow2(double num,int pow) {
        if(num == 0 && pow <= 0) {
            return -1;
        }
        double max=1;
        if(pow > 0) {
            max = pow2(num,pow);
            return max;
        }else if(pow < 0) {
            pow = -pow;
            max = pow2(num,pow);
            return 1/max;
        }else {
            return 1;
        }
    }
    public static double pow(double num,int pow) {
        double m = 1;
        for(int i = 1;i<=pow;i++) {
            m = m*num;
        }
        return m;
    }
    public static double pow2(double num,int pow) {
        if(pow == 0) {
            return 1;
        }
        if(pow == 1) {
            return num;
        }
        double res = pow2(num,pow>>1);
        res *= res;
        if((pow & 0x1) ==1) {
            res*=num;
        }
        return res;
       
    }

    public static void main(String[] args) {
        System.out.println(numpow1(2,1) +"===="+ numpow1(2,1));
        System.out.println(numpow1(2,0)+"===="+ numpow1(2,0));
        System.out.println(numpow1(2,-1)+"===="+ numpow1(2,-1));
        System.out.println(numpow1(0,-1)+"===="+ numpow1(0,-1));
        System.out.println(numpow1(0,1)+"===="+ numpow1(0,1));
        System.out.println(numpow1(0,0)+"===="+ numpow1(0,0));
        System.out.println(0x1);

    }

}
0 条评论
发表一条评论