zoukankan      html  css  js  c++  java
  • 剑指offer-数值的整数次方

    题目描述

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

    解题思路

    对于这道题,要考虑四种情况: 

     1、底数为0,指数为负数的情况,无意义 

     2、指数为0,返回1 

    3、指数为负数,返回1.0/base,-exponent 

    4、指数正数,base,exponent 

    第一反应我们会写出来的代码:

    class Solution {
    public:
        double Power(double base, int exponent) {
            double re=1.0;
            for(int i=1;i<=exponent;i++){
                re*=base;
            }
            return re;
        }
    };
     
    但如果输入的指数(exponent)小于1,即是0和负数的时候怎么办?上面的代码完全没有考虑,只包括了指数为正数的情况。
    进阶版代码:

    我们知道当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然的就要想到有没有可能对0求倒数,如果对0求倒数怎么办?当底数base是零且指数是负数的时候,我们不做特殊的处理,就会发现对0求倒数从而导致程序运行出错。怎么告诉函数的调用者出现了这种错误?在Java中可以抛出异常来解决。

    最后需要指出的是,由于0的0次方在数学上没有意义的,因此无论是输出0还是1都是可以接收的,但这都需要和面试官说清楚,表明我们已经考虑到了这个边界值了。

    有了这些相对而言已经全面很多的考虑,我们就可以把最初的代码修改如下:

    class Solution {
    public:
        double Power(double base, int exponent) {
            double re=1.0;
            if(exponent==0) return 1.0;
            if(base==0) return 0;
            if(exponent<0){
                base=1.0/base;
            }
            while(exponent){
                exponent=(exponent<0)?(++exponent):(--exponent);
                re*=base;
            }
            return re;
        }
    };
    

     上面代码运行时间是3ms,内存472k

    优化求幂函数

    当n为偶数,a^n =(a^n/2)*(a^n/2)
    当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
    时间复杂度O(logn)
    参考资料:
  • 相关阅读:
    Linux-解决putty无法直接使用root用户远程登录linux主机的问题
    Linux-安装jdk
    Linux-安装谷歌浏览器
    Linux-安装ssh服务
    java正则表达式匹配文本中想要的字符串
    日常技术资源收集
    《java编程思想》:散列的原理
    《java编程思想》:字符串
    win10完美去除快捷方式小箭头
    WS_2012
  • 原文地址:https://www.cnblogs.com/curo0119/p/9044956.html
Copyright © 2011-2022 走看看