首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【LeetCode每日打卡】50. Pow(x, n)

【LeetCode每日打卡】50. Pow(x, n)

作者头像
韩旭051
发布2020-06-23 10:47:30
发布2020-06-23 10:47:30
5750
举报
文章被收录于专栏:刷题笔记刷题笔记

Implement pow(x, n), which calculates x raised to the power n (xn).

Example 1:

Input: 2.00000, 10 Output: 1024.00000 Example 2:

Input: 2.10000, 3 Output: 9.26100 Example 3:

Input: 2.00000, -2 Output: 0.25000 Explanation: 2-2 = 1/22 = 1/4 = 0.25 Note:

-100.0 < x < 100.0 n is a 32-bit signed integer, within the range [−231, 231 − 1]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/powx-n 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

数学解法

所以求 x的n次方 可以转换为 e的 n*ln(x)次方的解法

当然我是想不出来了,看的评论区.

代码语言:javascript
复制
exp(n*log(abs(x)));

c++里面有 exp 函数 可以求 e的 n次方.

代码语言:javascript
复制
class Solution {
public:
    double myPow(double x, int n) {
        if(x == 0)  return 0;
        double ans;
        if(x > 0 || ((x < 0) && (n % 2 == 0)))    ans = exp(n*log(abs(x)));
        else ans = -exp(n*log(-x));
        return ans;
    }
};

作者:w-avan
链接:https://leetcode-cn.com/problems/powx-n/solution/c-ji-bai-shuang-bai-qiao-yong-dui-shu-han-shu-by-w/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分治

这是 我能想到的 不是暴力的 一种解法了

x的 n次方 可以拆成 x的平方的 n/2次方

用java代码跟C++并没有什么不同

代码语言:javascript
复制
class Solution {
    public double myPow(double x, int n) {
        double ans = 1;
        int sign = 1;
        if (n < 0) {
            sign = -1;
            if (n == Integer.MIN_VALUE) {
                n = -(n + 1);
                ans *= x;
            } else {
                n = -n;
            }
        }
        while (n > 0) {
            if (n % 2 == 1)
                ans *= x;
            n /= 2;
            x *= x;
        }
        return sign == 1 ? ans : 1 / ans;
    }
}

作者:iame
链接:https://leetcode-cn.com/problems/powx-n/solution/50-powx-n-java-xun-huan-qiu-jie-by-iame/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

if (n < 0) { // n是 负值特殊考虑 sign = -1; if (n == Integer.MIN_VALUE) { // 最小值特殊考虑 n = -(n + 1);// 如果是 最小值了 取负值会溢出 所以可以先拿出来一个 ans *= x 然后就可以理所应当的 -n -1; ans *= x;

/*

如果直接 return ans = 0.0;是可以的 如果 double x = 1 或者 x是负数的话,我默认 double x 都是大于二的数 这样是错误的理解。

*/ } else { n = -n; // 负值转换成正值 最后返回倒数即可 } }

// 从这里开始正式运算 while (n > 0) { if (n % 2 == 1) ans *= x; // 不是2的倍数就乘 多出来的一次 n /= 2; // 平方 n除二 x *= x; }

return sign == 1 ? ans : 1 / ans; // 负数返回倒数。

if(n == Integer.MIN_VALUE){

n = -(n + 2);

ans *= x;

ans *= x;

//return 0;

同理这样改也是对的,虽然有点画蛇添足 但是可以理解 为何

题目不难,思路很重要 数学那个解法我是真的没想到

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数学解法
  • 分治
    • x的 n次方 可以拆成 x的平方的 n/2次方
  • 用java代码跟C++并没有什么不同
    • 如果直接 return ans = 0.0;是可以的 如果 double x = 1 或者 x是负数的话,我默认 double x 都是大于二的数 这样是错误的理解。
  • 题目不难,思路很重要 数学那个解法我是真的没想到
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档