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)); } } |