• (原) 剑指offer--之数值的整数次方


    题目描述

    给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
     
    初次看题觉得这题好简单,直接用库函数power()不就行了,仔细想了想,万一不让用库函数呢于是就自己实现了一个power()函数,
    愚笨的脑子只考虑了一下几点
     
    1:base == 0,直接return 0
    2:base !=0,但exponent == 0时,return 1
    3:base != 0,exponent < 0时,求exponent绝对值,再求base 的exponent次方,然后返回其倒数
    4:base != 0,exponent > 0时,求base的exponent次方,
     
    c++代码
     
    #include <iostream>
    using namespace std;
    class Solution {
    public:
        double Power(double base, int exponent) {
            double result = 1.0;
            if (base == 0) return 0.0;
            else if (base != 0 && exponent == 0){
                return 1.0;
            }
            
            else if (exponent < 0){
                exponent = -exponent;
                for (int i = 0; i < exponent; ++i)
                    result  *= base;
                return 1.0 / result;        }
            else{
                for (int i = 0; i < exponent; ++i)
                    result *= base;
                return (double)result;
            }
        }
    };
    
    int main(){
        Solution su;
        double base;
        int exponent;
        while (true){
            scanf("%lf%d", &base, &exponent);
            printf ("%lf",su.Power(base, exponent));
        }
    }

    找来原书看了之后,好吧我承认我智商太低。

    关于代码的完整性:

    1:满足基本需求。

    2:对一些极端值要考虑到,比如一些边界值。

    3:对一些错误输入,有相应的处理方法。

    4:最好考虑到算法的效率。

    下面是按着原书方法又实现了一次

    全面低效的方法:

    #include <iostream>
    using namespace std;
    
    bool InvalidInput = false;
    
    bool equal(double val1, double val2)
    {
        if((val1 - val2 < 0.0000001) && (val1 - val2 > -0.0000001))
            return true;
        else
            return false;
    }
    
    double Power(double val, int exponent)
    {
        InvalidInput = false;
        if(equal(val, 0.0) && exponent < 0)
        {
            InvalidInput = true;
            return 0.0;
        }
        int absExponent = (unsigned int)(exponent);
        double rev = 1.0;
        if(exponent < 0)
            absExponent = (unsigned int)(-exponent);
        for(int i = 0; i < absExponent; ++i)
            rev *= val;
        if(exponent < 0)
            return 1.0 / rev;
        else
            return rev;
    }

    高效的方法:原书是这样描述的:

    如果exponent = 32,按照上述方法我们要循环31次乘法,

    而如果我们知道了base 的16次方可以直接平方就得到了base的32次方

    同理在8次方的基础上求16次方很容易用递归实现。

    double powerwithunsign(double base, int exponent){
        if (exponent == 0) return 1;
        if (exponent == 1) return base;
        double result = powerwithunsign(base, exponent>>2);
        result *= result;
        if ((exponent & 0x1) == 1)
            result *= base;
        return result;
    }
  • 相关阅读:
    c/c++ # and ## in macros以及宏debug
    postgresql unnamed statement
    postgresql/lightdb a [left/right] join b on true的含义
    openjdk、javafx各发行版
    lightdb for postgresql PL/pgSQL perform、execute、call区别
    postgresql有mysql兼容插件吗?
    各种互联网公司,不要再那么没有分寸的刷屏QPS/TPS/日活千万这些毫无意义的数据了
    PostgreSQL分布式数据库实践
    LightDB发布日常运维管理手册
    恒生电子发布金融分布式数据库LightDB
  • 原文地址:https://www.cnblogs.com/code-changeworld/p/4551907.html
Copyright © 2020-2023  润新知