算法学习记录十(C++)--->数值的整数次方

来源:互联网 发布:sqlserver 2008 64 编辑:程序博客网 时间:2024/05/20 06:23

描述

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

分析

1.普通方法,几次方就是乘以几次
2.位运算解法

普通解法

class Solution {public:    double Power(double base, int exponent) {        double ret = 1;        if(exponent == 0){            return 1.0f;        }        else if(exponent < 0){            while(exponent!=0){                ret /= base;                exponent++;            }        }        else{            while(exponent!=0){                ret *= base;                exponent--;            }        }        return ret;    }};

位运算

  • 1.全面考察指数的正负、底数是否为零等情况。
  • 2.写出指数的二进制表达,例如11表达为二进制1011。
  • 3.举例:10^1011 = 10^0001*10^0010*10^1000。
  • 4.通过&1和>>1来逐位读取1011,为1时将该位代表的乘数累乘ret到最终结果。 每位移一次都要翻倍
class Solution {public:    double Power(double base, int exponent) {        double ret = 1.0f; // 初始        double cur = base;         int ex = 0;        if(exponent==0){            return 1.0f;        }        else if(exponent>0){            ex = exponent;        }        else{        // 负数的时候分母要处理下            if(base==0){};            ex = -exponent;        }        // 指数位运算向右移动,不等于0的时候累乘        while(ex){            // 位运算中遇到1代表一次累乘            // 3.举例:10^1011 = 10^0001*10^0010*10^1000。            if((ex&1)==1){                ret *= cur;            }            // 每次位移都要翻倍10^0,10^1,10^2,10^4,10^8            cur *= cur;            // 这里一定要重新给ex赋值,不然死循环了            // ex>>1这样的话ex不会变的,没注意,会死循环            ex>>=1;        }        return exponent>0?ret:1/ret;    }};