题目:
实现函数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。
*/
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); } }