[쿠폰]의 힘 [16] [η]

제목 설명

  지수 함수는 전력의베이스를 찾고, 이중 전력 (배 기부, 지능 지수)을 달성한다. 많은 수의 문제를 고려해야 할 필요성을 제거하면서하지, 라이브러리 함수를 사용합니다.
  

아이디어 분석

  1. 고려하면 상황 지수는 제외하며, 상기베이스 인덱스 인덱스 음수이기 때문에, 제로가 될 수없는 부정적인 경우, 그것이 고려 이러한 상황을 고려하여 (분모가 제로가 될 수 없음) 인덱스의 전력의 절대 값의 역수 케이스 지수 전력 수요의 문제를 절대 값으로 변환 될 수 있으며, 즉 인덱스는 양수이며
  2. 이제 정수 전력의 값을 찾는 방법 (인덱스의 경우 양수가) 고려 :

    • 하나의 방법은, 사이클 시간 지수 제품을 얻기 위해 염기를 지수 직접 요청 인
    • 두 번째 영리한 방법, 당신은 여기에 아이디어의 피보나치 수, 재귀 적 방법을 사용할 수 있습니다

      • 인덱스가 짝수 인 경우 : 이는 두 가지로 나타낼 수 baseex/2파워의 곱
      • 기수 : 2로 표현 될 수 baseex/2곱으로 곱 전력 base(여기서는 ex/2프로그램의 동작이다 5/2 = 2)
      • 구조식이다 :

테스트 케이스

  지수와베이스 번호, 양수, 음수 및 0으로 제공됩니다.

자바 코드

public class Offer16 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }

    public static double powCustom(double base, int exponent) {
        return Solution2(base, exponent);
    }

    /**
     * 解法一, 要考虑到边界值, exponent为负数时,还要比如0的负数次方
     * 
     * 其中powCustomCore1 方法是利用 直接求的方法
     * 
     * @param base
     * @param exponent
     * @return
     */
    private static double Solution1(double base, int exponent) {
        if (base == 0 && exponent < 0) {
            throw new IllegalArgumentException("0的指数不能为负数");
        }
        int absExponent = exponent;
        if (exponent < 0) {
            absExponent = -exponent;
        }
        double result = powCustomCore1(base, absExponent);
        if (exponent < 0) {
            result = 1.0 / result;
        }
        return result;
    }

    /**
     * 方法一: 直接求,将exponent个 base 相乘
     * 
     * @param base     基数
     * @param exponent 指数
     * @return
     */
    private static double powCustomCore1(double base, int exponent) {
        double result = 1.0;
        for (int i = 1; i <= exponent; i++) {
            result *= base;
        }
        return result;
    }

    /**
     * 解法二, 要考虑到边界值, exponent为负数时,还要比如0的负数次方
     * 
     * 其中 powCustomCore2 方法是利用 递归的方法
     * 
     * @param base
     * @param exponent
     * @return
     */
    private static double Solution2(double base, int exponent) {
        if (base == 0 && exponent < 0) {
            throw new IllegalArgumentException("0的指数不能为负数!");
        }
        int absExponent = exponent;
        if (exponent < 0) {
            absExponent = -exponent;
        }
        double result = powCustomCore2(base, absExponent);
        if (exponent < 0) {
            result = 1.0 / result;
        }
        return result;
    }

    /**
     * 方法二:
     * 
     * exponent为偶数时,可以将其简化为 两个base的 ex/2 次幂 相乘 exponent为奇数时,可以将其简化为,两个base的 ex/2 次幂
     * 相乘之后再乘以base
     * 
     * @param base     基数
     * @param exponent 指数
     * @return
     */
    private static double powCustomCore2(double base, int exponent) {
        if (exponent == 0) {
            return 0;
        }
        if (exponent == 1) {
            return base;
        }
        double result = powCustomCore2(base, exponent >> 1);
        result *= result;
        if ((exponent & 1) == 1) {
            result *= base;
        }
        return result;
    }

    private static void test1() {
        System.out.println("3,3---->" + powCustom(3, 3));
    }

    private static void test2() {
        System.out.println("3,-3----->" + powCustom(3, -3));
    }

    private static void test3() {
        System.out.println("-3,3------>" + powCustom(-3, 3));
    }
}

코드 링크

안전 코드를 증명하는 행사는 -Java

추천

출처www.cnblogs.com/haoworld/p/offer16-shu-zhi-de-zheng-shu-ci-fang.html