剑指Offer系列(10)——数值的整数次方

题目如下:

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

         这个题目需要注意的有两点:一是我们需要分情况讨论,看似一个数的整数次方很好求,直接用exponent个base撑起来即可,但实际上我们要分以下几种情况。(以下用exp代替exponent)

                                                          为负数     base的正数次方分之一

                     base为负数          exp    为0         1

                                                           为正数    直接计算


                                                           为负数    不存在

                     base为0        exp           为0        1

                                                           为正数    直接计算



                                                          为负数   base的正数次方分之一

                     base为正数          exp    为0       1

                                                           为正数  直接计算


       第二个要注意的点是,double判等不能用==符号,只能用两者的差值来判断。(double 在运算中,由于截尾的原因,总是有误差的。)可以用如下代码判断:

	public static boolean doubleEqual(double d1 , double d2){
		if (d1 - d2 <= 0.0000001) {
			return true;
		}
		return false;
	}
        另外,这里当判断完成后直接计算有两种思路:
        1.用while循环直接计算:
        
private static double power1(double base, int i) {
		// TODO Auto-generated method stub
		double result = 1;
		while(i != 0){
			result  = result * base;
			i--;
		}
		return result;
	}

        2.运用如下公式递归处理:

                                  a^(n/2)*a^(n/2)

           a^n =            

                                  a^((n-1)/2)*a^((n-1)/2

        代码如下:

private static double power1(double base, int i) {
		// TODO Auto-generated method stub
		double result = 1;
		while(i != 0){
			result  = result * base;
			i--;
		}
		return result;
	}

    整体代码如下:

package com.offer;

public class Power {
	/*
	 * 计算一个数的整数次方
	 */
	public static void main(String[] args) {
		double base = 5;
		int exp = 6;
		System.out.println(power(base,exp));
	
	}
	
	private static double power2(double base, int exp) {
		// TODO Auto-generated method stub
		if (exp == 0 ) {
			return 1;
		}
		if (exp == 1) {
			return base;
		}
		double result = power2(base , exp >> 1);
		result *= result;
		if ((exp & 1) == 1) {
			//若exp为奇数,相当于exp%2==1
			result *= base;
		}
		return result;
	}

	public static boolean doubleEqual(double d1 , double d2){
		if (d1 - d2 <= 0.0000001) {
			return true;
		}
		return false;
	}



	private static double power(double base, int exp) {
		// TODO Auto-generated method stub
		if (doubleEqual(base,0.0)) {		//若底数等于0
			if (exp <= 0) {
				throw new RuntimeException("输入数字错误!");
			}
			return 0 ;		
		}
		if (exp == 0) {				//若指数等于0
			return 1;
		}else if (exp < 0) {		//若指数小于0
			return 1 / power1(base , - exp);
	      //return 1 / power2(base , - exp);
		}else{						//若指数大于0
//		return power1(base , exp);
			return power2(base , exp);
		}
		
	}

	private static double power1(double base, int i) {
		// TODO Auto-generated method stub
		double result = 1;
		while(i != 0){
			result  = result * base;
			i--;
		}
		return result;
	}

}

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值