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

描述

  • 给定一个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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值