剑指Offer——题目12

/* 日期:2019.7.17
 * 作者:***
 * 功能:剑指offer 题目12
 * 
 * =========================================================
 * 问题描述:
 * 给定一个double类型的浮点数base和int类型的整数exponent。
 * 求base的exponent次方。
 * 
 * ==========================================================
 * 思路详解:
 * 这个问题无非就是计算一个数值的给定次方,看似简单,其实很能考察一个基础编程者的差距。
 * 根本的需要注意的地方就是,我们怎么去较少计算次数,也就是所谓的时间复杂度
 * double本身很大的时候,int也很大的时候,这种差距变得就非常明显了
 * 
 * 所以,这里采用的是二分的思路,进行计算大致的幂运算
 * 由于剑指offer上对改题目的描述并不是很清晰,没有说到底数为0,幂为负数的时候,应该如何输出,
 * 所以这里,采取了抛出运行时异常的方法,不做处理
 * 
 * 改题目无论怎么解答,其都有需要注意的地方:
 * 1.幂值的正负性
 * 2.幂值的奇偶性
 * 3.底数为0时的特殊性
 * 4.底数double,幂值int较大数据下的时间复杂度
 * 
 * =============================================================
 * 使用了二分法的思想,所以时间复杂度减少为诶 O(logn)
 * 
 * */

package com.***********;

import java.util.*;


public class Main3 {
	
	//主函数,作为程序测试代码的入口
	public static void main(String args[])
	{
		Main3 main3 = new Main3();
		System.out.println("请输入该计算中的底数(double类型):");
		Scanner scanner = new Scanner(System.in);
		double base = scanner.nextDouble();
		System.out.println("请输入该计算中的幂数(int类型):");
		int exponent = scanner.nextInt();
		
		double result = main3.Power(base, exponent);
		System.out.println("计算结果显示为:"+result);
	}

	//封装函数,解决问题
	public double Power(double base, int exponent) {
        //这里采用二分的思想:
		//需要注意的点是:
		//1.次方的奇偶性
		//2.次方的正负性
		if(exponent == 0) return 1;
		if(exponent == 1) return base;
		
		boolean flag = false;	//标记变量,标记出幂是否为负数
		if(exponent < 0)	//当幂为负数的时候,先标记出来,然后计算其正的幂,最后取倒数
		{
			exponent = -1 *exponent;
			flag = true;
		}
		
		if(flag && base == 0) 
			throw new RuntimeException();
		
		double result = Power(base,exponent / 2);	//使用二分的思路进行迭代计算
		result *= result;
		
		if(exponent % 2 == 1)	result *= base;		//奇偶性处理
		if(flag) result = (1.0 / result);			//正负性处理
		
		return result;
	}
}

 

你可能感兴趣的:(剑指Offer)