package com.jianzhioffer.power;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 题目:实现数值的整数次方,不能使用库函数
* 1)用一个全局变量记录非法输入。 考虑边界情况,比如0^0,0^(M),M小于0的情况,指数是负数的情况
* 2)库函数 Math.pow(base,exponent)
* 3)利用 n为偶数时~ A^n = A^(n/2)*A^(n/2);
* n为奇数时~ A^n =A^((n-1)/2)*A^((n-1)/2)*A;
*
* @author hexiaoli 思考:
*
*/
public class Solution {
public static double power(double base, int exponent) {
boolean invaliedInput = false;
// 底数为0,指数<=0,是非法输入
if (base == 0 && exponent <= 0) {
invaliedInput = true;
throw new IllegalArgumentException("InvaliedInput");
}
// 如果基数为0则返回0
if (base == 0 && exponent > 0) {
return 0;
}
// 如果基数不为0,指数为0, 则返回1
if (base != 0 && exponent == 0) {
return 1;
}
// 如果基数不为0,指数为1,输出本身。
if (base != 0 && exponent == 1) {
return base;
}
int n = exponent;
// 指数是负数时,需要转换一下。
if (n < 0) {
n = -exponent;
}
double result = power(base, n >> 1);
result *= result;
// 如果n是奇数,那么要多乘1个base
if ((n & 1) == 1) {
result *= base;
}
return exponent > 0 ? result : 1 / result;
}
public static void main(String[] args) throws IOException {
BufferedReader bReader1 = new BufferedReader(new InputStreamReader(System.in));
String str1 = bReader1.readLine();
double base = Double.parseDouble(str1);
BufferedReader bReader2 = new BufferedReader(new InputStreamReader(System.in));
String str2 = bReader2.readLine();
int exponent = Integer.parseInt(str2);
System.out.println(power(base, exponent));
}
}