剑指offer(12)数值的整数次方

本文介绍了一种在Java中实现数值整数次方的方法,避免使用库函数Math.pow。通过递归方式,利用指数为偶数或奇数的特性进行优化计算,同时处理了包括0^0在内的各种边界情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值