【题目】

实现函数double Power(double base, int exponent),求base的exponent次方,不需要考虑溢出。

【分析】

这是一道看起来很简单的问题,很容易写出如下的代码:

 C++ Code 
1
2
3
4
5
6
7
8
9
 
double Power(double base, int exponent)
{
    ;
    ; i <= exponent; ++i)
        result *= base;

return result;
}

上述代码存在的问题:

(1) 由于输入的exponent是个int型的数值,因此可能为正数,也可能是负数,上述代码只考虑了exponent为正数的情况。

(2) 底数为0,指数为负数,则输入非法。

改进之后代码如下:

【代码1】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
bool g_bValid = true;

bool Equal(double num1, double num2)
{
    ;
    if (num1 - num2 > -gap && num1 - num2 < gap)
        return true;
    return false;
}

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    // T(n) = O(n)
;
    ; i < exponent; ++i)
        result *= base;
    return result;
}

double Power(double base, int exponent)
{
    g_bValid = true;
    ))
    {
        )
        {
            g_bValid = false;
        }
        ;
    }

unsigned int absExponent = (unsigned int)exponent;
    )
        absExponent = (unsigned int)(-exponent);

double result = PowerWithUnsignedExponent(base, absExponent);
    )
        result =  / result;

return result;
}

其时间复杂度为O(n),如何进一步改进?

我们可以用如下公式求a的n次方,其时间复杂度为O(lgn):

n is even: a^n = a^(n/2)*a^(n/2)

n is odd: a^n = a^((n-1)/2)*a^((n-1)/2) * a

改进后代码如下:

【代码2】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
/*
n is even: a^n = a^(n/2)*a^(n/2)
n is odd: a^n = a^((n-1)/2)*a^((n-1)/2) * a
*/
double PowerWithUnsignedExponent2(double base, unsigned int exponent)
{
    // T(n) = O(lgn)
)
        ;
    )
        return base;

);
    result *= result;

if (exponent & 0x1)
    {
        // exponent is odd
        result *= base;
    }
    return result;
}

【参考】

http://zhedahht.blog.163.com/blog/static/254111742009101563242535/

44. log(n)求a的n次方[power(a,n)]的更多相关文章

  1. [LeetCode] Pow(x, n) 求x的n次方

    Implement pow(x, n). 这道题让我们求x的n次方,如果我们只是简单的用个for循环让x乘以自己n次的话,未免也把LeetCode上的想的太简单了,一句话形容图样图森破啊.OJ因超时无 ...

  2. C语言求x的y次方,自定义函数,自己的算法

    我是一名高二中学生,初中时接触电脑,非常酷爱电脑技术,自己百度学习了有两年多了,编程语言也零零散散的学习了一点,想在大学学习计算机专业,所以现在准备系统的学习C语言,并在博客中与大家分享我学习中的心得 ...

  3. 50 Pow(x, n)(求x的n次方Medium)

    题目意思:x为double,n为int,求x的n次方 思路分析:直接求,注意临界条件 class Solution { public: double myPow(double x, int n) { ...

  4. [华为机试练习题]50.求M的N次方的最后三位

    题目 描写叙述: 正整数M 的N次方有可能是一个很大的数字,我们仅仅求该数字的最后三位 例1: 比方输入5和3 ,5的3次方为125.则输出为125 例2: 比方输入2和10 2的10次方为1024 ...

  5. $O(n+log(mod))$求乘法逆元的方法

    题目 LOJ #152. 乘法逆元 2 题解 一个奇技淫巧qwq.可以离线求乘法逆元,效率\(O(n+log(mod))\). 考虑处理出\(s_n\)表示\(\prod_{i=1}^na_i\).以 ...

  6. 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)

    昨天做了一个题,简化题意后就是求2的n次方对1e9+7的模,其中1<=n<=10100000.这个就算用快速幂加大数也会超时,查了之后才知道这类题是对费马小定理的考察. 费马小定理:假如p ...

  7. 使用分治法求X的N次方,时间效率为lgN

    最近在看MIT的算法公开课,讲到分治法的求X的N次方时,只提供了数学思想,于是自己把代码写了下,虽然很简单,还是想动手写一写. int powerN(int x,int n){ if(n==0){ r ...

  8. 算法导论-求x的n次方

    目录 1.分治求x的n次方思路 2.c++代码实现 内容 1.分治求x的n次方思路T(n)=Θ(lgn) 为了计算乘方数a^n,传统的做法(所谓的Naive algorithm)就是循环相乘n次,算法 ...

  9. [LeetCode] 50. Pow(x, n) 求x的n次方

    Implement pow(x, n), which calculates x raised to the power n(xn). Example 1: Input: 2.00000, 10 Out ...

随机推荐

  1. JQuery学习(2)之Ajax

    同步传输 正 多件事情一起做 | 程 不 事情一件一件地做 常: | 序 是: 异步传输 人 事情一件一件地做 | 员 人 多件事情可以一起做 附加(XML) ★XML作用:用来存储数据. ★XML特 ...

  2. 【前端】Sublime text3 插件LiveReload 实现实时预览

    1.首先要安装插件LiveReload Sublime text3. 菜单 preferences->packages control,输入install.. 回车,输入LiveReload回车 ...

  3. Yii2分页

    Yii中的分页功能主要由yii\web: Linkable接口.yii\widgets: LinkPager类和yii\data: Pagination类三个组成 yii\data: Paginati ...

  4. 利用getHibernateTemplate实现简单的操作

    package org.tarena.dao; import java.sql.SQLException; import java.util.List; import javax.annotation ...

  5. 洛谷 P1238 走迷宫

    因为小处疏漏,多花了半小时的水题 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束 ...

  6. ubuntu安装spark

    1.先得准备环境,需要JAVA环境,还有Python环境(默认会有) JAVA下载JDK之后配置JAVA环境变量 export JAVA_HOME=/opt/jdk1..0_45 export JRE ...

  7. AppStore占坑注意事项

    AppStore占坑注意事项 我们会提前在AppStore(iTunesConnect)里注册一些应用名称,以满足未来业务需要和防止恶意注册,其中有一些需要注意的事情,整理如下: 倒计时180天 为了 ...

  8. json对象和json字符串有啥区别啊

    json对象可以通过javascript存取属性!json对象装成json字符串经常用于前后台传输数据! 如果你在前台使用,那么Json对象可以通过xx.name来调用,如果是字符串,那么就是字符串了 ...

  9. tomcat管理员配置

    纸上得来终觉浅,绝知此事要躬行 博客园 首页 新闻 新随笔 联系 管理 随笔- 458  文章- 0  评论- 38  Tomcat的Manager显示403 Access Denied   管理to ...

  10. Spring IoC、DI入门小程序

    Alt+/智能提示xml配置文件节点及属性:在接口上使用Ctrl+T可以提示其实现类 一.IoC控制反转(将创建对象的权利交给spring)入门小程序 1.引入jar包 2.工程基本结构 3.新建Us ...