• 数值的整数次方


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

    【思路】首先我们来说一个O(n)的方法,这个题目主要考虑到幂指数为负的情况需要对结果求倒数。

    1class Solution {
     2public:
     3    double Power(double base, int exponent) {
     4        double res = 1;
     5        if(exponent == 0)
     6            return 1;
     7        if(base == 0)
     8            return 0;
     9        for(int i = 0;i < abs(exponent); ++i){
    10            res *= base;
    11        }
    12        if(exponent < 0){
    13            res = 1 / res;
    14        }
    15        return res;
    16    }
    17};

    显然,上面的算法一定不会合面试官的胃口的,因此我们可以使用一个快幂算法来进行求解!其实际编程不复杂,但是效率很高的!

    假设3^64需要64个乘法运算,但如果这样计算的话:

    3^1 = 3 (也就是base)
    3^2 = (3^1) * (3^1)
    3^4 = (3^2) * (3^2)

    3^64 = (3^32) * (3*32)

    这个样子的话,就只算6次乘法,效率提升了很多了!因此我们就可以进行如下编程。

     1class Solution {
     2public:
     3    double Power(double base, int exponent) {
     4        if(exponent == 0){
     5            return 1;
     6        }
     7        if(base == 0){
     8            return 0;
     9        }
    10        double tmp = base;
    11        double res = 1;
    12        int e = abs(exponent);
    13        while(e > 0){
    14            if(e & 1){   //e & 1相当于e % 2 
    15                res *= tmp;
    16            }
    17            e >>= 1;   // e >> 1相当于e / 2
    18            tmp *= tmp;
    19        }
    20        return (exponent > 0) ? res : 1 / res;
    21    }
    22};
  • 相关阅读:
    【leetcode】 61. 旋转链表
    【leetcode】 55 跳跃游戏
    【leetcode 53】 最大子序和
    【leetcode】不同路径
    【leetcode】692. 前K个高频单词
    vue a标签使用@click
    函数式接口的使用
    【转】MyBatis中的collection两种使用方法
    xaf--homepage
    Windows10--设置鼠标自带光圈效果
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11312171.html
Copyright © 2020-2023  润新知