剑指Offer——(12)数值的整数次方
2017-05-04 17:14
363 查看
题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
实现如下:
给定一个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)); } };
相关文章推荐
- (C++)剑指offer-12:数值的整数次方(代码的完整性)
- 剑指offer-算法题练习:part12 数值的整数次方
- 【剑指offer】12数值的整数次方
- 数值的整数次方(剑指Offer 第 12 题)
- 牛客网-剑指offer-12-数值的整数次方
- [剑指Offer] 12.数值的整数次方
- 剑指offer——12.数值的整数次方
- 【剑指offer-解题系列(12)】数值的整数次方
- 剑指offer 数值的整数次方
- 【剑指offer】数值的整数次方
- 剑指Offer——数值的整数次方
- 剑指offer---16(数值的整数次方)
- 剑指offer题解 数值的整数次方
- 剑指offer--数值的整数次方
- 剑指Offer:数值的整数次方
- 剑指Offer面试题11(Java版):数值的整数次方
- 剑指offer-数值的整数次方
- 剑指Offer之数值的整数次方(题11)
- 剑指offer面试题11之求数值的整数次方
- 剑指offer 数值的整数次方