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

Implement pow(xn).

这道题让我们求x的n次方,如果我们只是简单的用个for循环让x乘以自己n次的话,未免也把LeetCode上的想的太简单了,一句话形容图样图森破啊。OJ因超时无法通过,所以我们需要优化我们的算法,使其在更有效的算出结果来。我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可,代码如下:

解法一

class Solution {
public:
    double pow(double x, int n) {
        if (n < 0) return 1 / power(x, -n);
        return power(x, n);
    }
    double power(double x, int n) {
        if (n == 0) return 1;
        double half = power(x, n / 2);
        if (n % 2 == 0) return half * half;
        return x * half * half;
    }
};

还有一种写法可以只用一个函数即可,在每次递归中就检查n的正负,然后做相应的变换即可,代码如下:

解法二

class Solution {
public:
    double pow(double x, int n) {
        if (n == 0) return 1;
        double half = pow(x, n / 2);
        if (n % 2 == 0) return half * half;
        else if (n > 0) return half * half * x;
        else return half * half / x;
    }
};
时间: 2024-12-29 23:15:30

[LeetCode] Pow(x, n) 求x的n次方的相关文章

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

题目意思:x为double,n为int,求x的n次方 思路分析:直接求,注意临界条件 1 class Solution { 2 public: 3 double myPow(double x, int n) { 4 if(x==1.0)return x; 5 else if(x==-1.0){ 6 if(n%2==0)return 1.0; 7 else return -1.0; 8 } 9 double ans=1.0; 10 int flag=abs(n); 11 while(flag--&

[LintCode] Pow(x, n) 求x的n次方

Implement pow(x, n). Notice You don't need to care about the precision of your answer, it's acceptable if the expected answer and your answer 's difference is smaller than 1e-3. Have you met this question in a real interview? Yes Example Pow(2.1, 3)

【LeetCode-面试算法经典-Java实现】【050-Implement pow(x, n)(求x的n次方)】

[050-Implement pow(x, n)(求x的n次方)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Implement pow(x, n). 题目大意 求x的n次方. 解题思路 递归求解. 代码实现 算法实现类 public class Solution { public double myPow(double x, int n) { if (x == 0 && n == 0) { throw new IllegalArgumentExcepti

[LeetCode] Pow(x, n) (二分法)

Implement pow(x, n). 刚开始没想到,后来看remlost的博客才写出来,代码很简练: class Solution { public: double pow(double x, int n) { if(n<0) return 1/power(x,-n); else return power(x,n); } private: double power(double x, int n){ if(n==0) return 1; double v = power(x,n/2); if

LeetCode: Pow(x, n) [049]

[题目] Implement pow(x, n). [题意] 实现pow(x, n) [思路] 最直接的思路是用一个循环,乘n次的x. 当n的值较小的时候还好,当n非常大时,时间成本就非常高.加入n=INT_MAX, 也就是21亿多次循环,你可以试想一下. 在这种情况下,我们需要快速的乘完n个x,采用尝试贪心的方法,即滚雪球方式的翻倍相乘 注意:几种特殊情况 1. n=0: 2. n<0; [代码] class Solution { public: double pow(double x, in

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

我是一名高二中学生,初中时接触电脑,非常酷爱电脑技术,自己百度学习了有两年多了,编程语言也零零散散的学习了一点,想在大学学习计算机专业,所以现在准备系统的学习C语言,并在博客中与大家分享我学习中的心得与思路.希望大牛路过的时候指点指点. 可以说是第N次学习C语言了,都是学到数组和函数这里停止了,这次下定了决心要学完C语言,不光要学完,还要学好下面是利用自定义函数写的一个模仿pow()函数工作的一个小程序[求x的y次方] 1 #include<stdio.h> 2 3 int main(void

C++刷题——2713: 函数---求x的y次方

编写函数POW,函数声明如下: int POW(int x,int y); //求x的y次方的函数声明 在以下程序的基础上,添加POW函数的定义,使程序能够正确执行. /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 5 月 22 日 * 版 本 号:v1.0 */ #include <iostream> using namespace std; int POW(int x,int y); //求x的y次方的函数声明 i

OJ刷题之《求a的b次方》

题目描述 编写函数POW,函数声明如下: int POW(int x,int y); //求x的y次方的函数声明 在以下程序的基础上,添加POW函数的定义,使程序能够正确执行. 提交时,只需要提交POW函数的定义代码即可. #include <iostream> using namespace std; int POW(int x,int y); //求x的y次方的函数声明 int main() { int a,b; cin>>a>>b; cout<<a&l

递归练习之求 x 的 N 次方

/********************************************************************************* Copyright (C), 1988-1999, drvivermonkey. Co., Ltd. File name: Author: Driver Monkey Version: Mail:[email protected] qq:196568501 Date: 2014.04.02 Description: 递归练习之求 x