2021.12.10_每日一题 leetcode.50

/**
 * @author nuo
 * @version 1.0
 * @description: TODO LeetCode 50
 * @date 2021/12/10 13:19
 */

/*
 * 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。
 * 示例 1:
 * 输入:x = 2.00000, n = 10
 * 输出:1024.00000
 * 示例 2:
 * 输入:x = 2.10000, n = 3
 * 输出:9.26100
 * 示例 3:
 * 输入:x = 2.00000, n = -2
 * 输出:0.25000
 * 解释:2-2 = 1/22 = 1/4 = 0.25
 *
 * 提示:
 *     -100.0 < x < 100.0
 *     -231 <= n <= 231-1
 *     -104 <= xn <= 104
 */
public class day07 {
//    0_0
    public static double myPow1(double x, int n) {
        return Math.pow(x,n);
    }

//    栈溢出 291/304
    public static double myPow2(double x, int n) {
        if (n == 0){
            return 1.0;
        }else {
            if (n < 0){
                n = - n;
                x = 1 / x;
            }
            return x * myPow2(x, n - 1);
        }
    }
//    超时 301/304
    public static double myPow3(double x, int n) {
        if (x == 1.0 || n == 0){
            return 1.0;
        }
        if (n < 0){
            x = 1.0 / x;
            n = -n;
        }
        double sum = x;
        for (int i = 0; i < n - 1; i++) {
            sum *= x;
        }
        return sum;
    }

//    试图改进,依旧超时 301/304
    public static double myPow4(double x, int n) {
        if (x == 1.0 || n == 0){
            return 1.0;
        }
        if (n < 0){
            x = 1.0 / x;
            n = - n;
        }
        n--;
        double sum = x;
        if (n % 2 == 1){
            for (int i = 0; i < ((n - 1) / 2); i ++) {
                sum *= x;
            }
            sum = sum * sum ;
        }else {
            for (int i = 0; i < (n / 2); i++) {
                sum *= x ;
            }
            sum = sum * sum / x;
        }
        return sum;
    }

//    甚至超时291/304 ,开始离谱
    public static double myPow5(double x, int n) {
        if (n == 0 || x == 1){
            return 1.0;
        }
        if (x == 0){
            return 0;
        }
        if (n == 1){
            return x;
        }
        if (n < 0){
            x = 1 / x;
            n = -n;
        }
        if (n % 2 == 0){
            return myPow5(x,n/2) * myPow5(x,n/2);
        }else {
            return myPow5(x,n/2) * myPow5(x,n/2 + 1);
        }
    }
//    别人帮忙的版本 304 / 304
    public double myPow6(double x, int n) {
        long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }

    public double quickMul(double x, long N) {
        if (N == 0) {
            return 1.0;
        }
        double y = quickMul(x, N / 2);
        return N % 2 == 0 ? y * y : y * y * x;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值