剑指offer之十一---数值的整数次方

来源:互联网 发布:海康录像机设备域名 编辑:程序博客网 时间:2024/05/19 22:06

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。


时间限制:1秒空间限制:32768K热度指数:149847

我的思路二种:(比较菜)

思路一:库函数:

return Math.pow(base, exponent);//41ms 9120k

思路二:累乘

int count = 0;double positiveResult = base;double negtiveResult = 1.0 / base;if (exponent > 0) {while (count < exponent - 1) {positiveResult = positiveResult * base;count++;}return positiveResult;} else if (exponent == 0) {return 1.0;} else {while (exponent < -1) {negtiveResult = negtiveResult * (1.0 / base);exponent++;}return negtiveResult;}

大神的思路:

            /**
             * 1.全面考察指数的正负、底数是否为零等情况。
             * 2.写出指数的二进制表达,例如13表达为二进制1101。
             * 3.举例:10^1101 = 10^0001*10^0100*10^1000。
             * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
             */

public static double Power(double base, int exponent) {                               double res = 1;int n;if (exponent > 0) {n = exponent;} else if (exponent < 0) {if (base == 0)throw new RuntimeException("分母不能为0");n = -exponent;} else {// exponent==0return 1;// 0的0次方}while (n != 0) {if ((n & 1) == 1)res *= base;base *= base;// 翻倍n >>= 1;// 右移一位}return exponent >= 0 ? res : (1 / res);}