zoukankan      html  css  js  c++  java
  • Pow(x, n) -- leetcode

    Implement pow(double x, int n). – leetcode
    自定义实现pow函数.
    注意点:
    (1) double类型的值,不能用 == 来判断是否相等,应该用一定的误差值来判断;
    (2) 特殊情况的处理:
    1) x 为 0 同时 n 为 0
    2) x 不为 0 , n 为 0
    3) x 不为 0, n 为 负数的情况.(可以将负数转为正数,然后求结果的倒数. 注意点是:负数的最小值,转为正数的话,就会越界. 解决办法是先对负数加1后,在转为正数,然后乘以1/x, 保证结果).

    如果直接用循环迭代的过程求解的话, 时间复杂度过高, 难以通过编译. 观察可以知道:
    当n > 0时:
    迭代公式

    根据迭代公式-有代码:

    public:
        double Power(double base, int exponent) {
            //底数指数均为0, equal(base,0)为判断 base 与 0 是否相等(特殊情况的处理, 这里当底数指数均为 0 的情况下, 值为 1)
            if (equal(base,0) && exponent == 0) return 1.0;
            //指数为0
            if (exponent == 0) return 1.0;
            //指数为复数
           if (exponent < 0){//指数为负数, 指数加1, 然后转换为正数求解
               return 1/base * PowerWithExponent(1/base, -(exponent+1));
          }
            //指数为正数
           return PowerWithExponent(base, exponent); 
        }
    
        //递归求解想:
        //a^x = (1) a^(x/2) * a^(x/2)              x为偶数
        //    (2) a^((x-1)/2) * a^((x-1)/2) * a    x为奇数
        double PowerWithExponent(double base, int exponent){
            //指数为 0, 返回 1
            if (exponent == 0) return 1;
            //指数为 1, 返回 base
            if (exponent == 1) return base;
            double result = PowerWithExponent(base, exponent >> 1);//exponent >> 1 位移操作,相当于除以2,但是性能更好
            result *= result;
            if (exponent & 0x1 ){//exponent & 0x1  相当于求%运算,性能更优. exponent & 0x1 == 1 表示奇数
                result *= base;
            }
            return result;
        }
        //判断两个double是否相等, 不能用 == 求解
        bool equal (double a, double b){
            if ((a-b > -0.0000001) && (a-b)<0.0000001) return true;
            else return false;
        }    
    };
    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    哈佛大学官网图标下拉变小代码
    9.23 基础知识
    选项卡效果
    滑动效果
    进度条的制作
    图片轮播
    子菜单下拉
    DIV做下拉列表
    日期时间选择
    电池的基本知识
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/7779785.html
Copyright © 2011-2022 走看看