剑指Offer——(12)数值的整数次方

xiaoxiao2021-02-27  307

题目描述:

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

实现如下:

//方法一:循环 //此题不需要考虑计算后值溢出的情况,即不存在大数情况 //异常情况: //底数为0时->0.0 //指数为0时->1.0(数学定义) //指数为负数时,需要考虑先计算指数绝对值的结果,再取倒数 class Solution { public: double Power(double base, int exponent) { //底数为0时,因为base为double类型,所以需要进行范围判断 if (base - 0 <= 0.0000001 && base - 0 >= -0.0000001) return 0.0; if (exponent == 0) return 1.0;//指数为0,return double res = base; int unsigned_exponent = abs(exponent);//先取绝对值,考虑exp为负 for (int i = 2; i <= unsigned_exponent; ++i) { res *= base; } if (exponent < 0) res = 1.0 / res;//exp为负数时,取res的倒数 return res; } }; //方法二:递归 //计算的指数若为n,则只需计算指数为(n/2)时的值,用这个值再平方就可以得到指数为n的值 //注意: //n为奇数时。需要再乘以一个base,因为(n/2)向下取整 //exponent还是先计算为正数的情况,之后再判断是否求倒数 class Solution { public: double unsignedPower(double base, int exponent) { if (exponent == 1)//指数为1,return base return base; else if (exponent == 0)//指数为0,return 1 return 1; double res = unsignedPower(base, exponent >> 1);//右移一位->除2 res *= res;//再平方,减少运算次数 if (exponent & 0x1) res *= base;//判断指数是否为奇数,与1异或->模2 return res; } double Power(double base, int exponent) { //判断底数是否为0 if (base - 0 <= 0.0000001 && base - 0 >= -0.0000001) return 0.0; if (exponent == 0) return 1.0; //判断指数是否为0 if (exponent < 0) return 1.0 / unsignedPower(base, abs(exponent));//负指数应求倒数 else return unsignedPower(base, abs(exponent)); } };
转载请注明原文地址: https://www.6miu.com/read-5225.html

最新回复(0)