《剑指offer》练习-面试题16-数值的整数次方

题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

链接:https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00

思路:指数为负数时,输出的结果是base的倒数。但是base为0时,0是没有倒数的。此时可以选择抛出异常。

package offer;

import java.util.Scanner;

/* 
 * 1.底数为0,指数<0,输入异常
 * 会出现对0求倒数的情况,需进行错误处理,设置一个全局变量;
 * 2.base是否等于1
 * 由于base是double型,不能直接用==判断
 * 3.优化求幂函数
 * 当e为偶数时,b^e=b^(e/2)*b^(e/2)
 * 当e为奇数时,b^e=b^[(e-1)/2]*b^[(e-1)/2]*b
 * 酱时间复杂度为O(logn)
 * */
public class Solution16 {
	boolean invalidInput = false;

	public double Power(double base, int exponent) {
		if (equal(base, 0.0) && exponent < 0) {
			invalidInput = true;
			return 0.0;
		}
		int absexponent = exponent;
		if (exponent < 0)
			absexponent = -exponent;
		double res = getPower(base, absexponent);
		if (exponent < 0)
			res = 1.0 / res;
		return res;

	}

	public double getPower(double b, int e) {
		if (e == 0)
			return 1.0;
		if (e == 1)
			return b;
		double result = getPower(b, e >> 1);  // 右移运算符代替了/
		result *= result;
		// 也算递归停止条件
		if ((e & 1) == 1)   // 位于运算符代替了%,表示若e为奇数,再乘以一个底数
			result *= b;
		return result;

	}

	private boolean equal(double num1, double num2) {
		if (num1 - num2 > -0.0000001 && num1 - num2 < 0.0000001)
			return true;
		return false;
	}

	/*
	 * public static void main(String[] args) { Scanner scanner = new
	 * Scanner(System.in); Solution16 sl = new Solution16();
	 * 
	 * System.out.print("请输入底数base:"); double base = scanner.nextDouble();
	 * 
	 * System.out.print("请输入指数exponent:"); int exponent = scanner.nextInt();
	 * 
	 * // double result1 = sl.Power(base, exponent); double result2 = sl.Power(base,
	 * exponent); // System.out.println("算法1中base的exponent次方为:" + result1);
	 * System.out.println("算法1中base的exponent次方为:" + result2); }
	 */
}

注意递归的用法啊!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值