• 剑指offer 数值的整数次方


    题目描述

    给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
     
    思路:底数是double类型的浮点数, 指数是int类型:包括0,正负整数。
     
    考虑异常情况:
    1)0的0次方。
    2)底数为0.0时,指数是负整数。
     
    代码一:排除异常情况后,求次幂用递归
     1 class Solution {
     2 private:
     3     bool equal(double i, double j) {
     4         //判断两个浮点类型数是否相等
     5         if ((i - j) < 1e-8 && (i - j) > -1e-8) {
     6             return true;
     7         } else {
     8             return false;
     9         }
    10     }
    11     double power(double base, int exponent) {
    12         //当指数为0时,返回1
    13         if (exponent == 0) {
    14             return 1;
    15         }
    16         //用移位操作代替/2, 效率快很多, 此时res = base ^ (exponent / 2)
    17         double res = power(base, exponent >> 1);
    18         // res = base ^ ((exponent / 2) * 2)
    19         res *= res;
    20         //如果为奇数,res = res * base;
    21         if (exponent & 1) {
    22             res *= base;
    23         }
    24         return res;
    25     }
    26 public:
    27     double Power(double base, int exponent) {
    28         if (equal(base, 0.0) && exponent <= 0) {
    29             return 0.0;
    30         }
    31         int p = abs(exponent);
    32         double res = power(base, p);
    33         return exponent < 0 ? (1.0 / res) : res;
    34     }
    35 };

    代码二:快速幂运算

    加入底数为a, 指数为11, 我们要求a^11, 11的二进制表示为1011, 于是a^11 = a^(8+2+1) = a^(1000) * a^(0010) * a^(0001)

     1 class Solution {
     2 private:
     3     bool equal(double i, double j) {
     4         //判断两个浮点类型数是否相等
     5         if ((i - j) < 1e-8 && (i - j) > -1e-8) {
     6             return true;
     7         } else {
     8             return false;
     9         }
    10     }
    11 public:
    12     double Power(double base, int exponent) {
    13         if (equal(base, 0.0) && exponent <= 0) {
    14             //throw new RuntimeException("Denominator cannot be zero");
    15             return 0.0;
    16         }
    17         int p = abs(exponent);
    18         double res = 1.0;
    19         while (p) {
    20             if (p & 1) {
    21                 res *= base;
    22             }
    23             p >>= 1;
    24             base *= base;
    25         }
    26         return exponent > 0 ? res : 1.0 / res;
    27     }
    28 };
  • 相关阅读:
    【转】忘记密码功能的安全实现(邮件方式)
    windows7下安装gem包---bcrypt-ruby
    Ruby中的%表示法
    ruby中特殊的全局变量
    rails中一个窗体多个模型——fields_for
    【转】深刻理解render 和 redirect_to
    UML核心元素--分析类
    UML核心元素--包
    UML核心元素--边界
    UML核心元素--用例
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11249009.html
Copyright © 2020-2023  润新知