首页 > 其他 > 详细

剑指offer(5)

时间:2020-05-30 00:47:06      阅读:51      评论:0      收藏:0      [点我收藏+]

本期 数值的整数次方

题目 011数值的整数次方——给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

第一次尝试

public double expCal(double base, int exponent){

  double res = 1;

  for(int i =0; i< exponent; i++){

    res *= base;

  }

  return res;

}

当然我们都知道,这种写法对芯片太不友好了,计算量巨大。但是,相比于不够好,更重要的是会出现错误。写程序很重要的一点是考虑边界问题。在这道题中,exponent的边界有0,负数,以及当exponent为负数时base不能为0.

public class Solution {

  int n = exponent;

  if(n == 0)  return 1;

  if(n < 0 && base == 0)  throw new Exception(" Base cannot be negative! ");

  if(n < 0){

    if(base == 0)  throw new Exception(" Base cannot be negative! ");

    n= -exponent;

  }

  double res = expCal(base, exponent);

  return n<0? 1/res: res;

public double expCal(double base, int exponent){ 

  double res = 1;

  for(int i =0; i< exponent; i++){

    res *= base;

  }

  return res;

}}

接下来提高计算效率,减少计算量。

因为要乘以整数次的底数,所以可以考虑递归

若整数是偶数,则平方,若是奇数,则平方后再乘一次底数

public class solution{

public double pow(double base, int exponent){

  if(exponent == 0)  return 1;

  if(exponent == 1)  return base;

  double res = pow(base, exponent/2);

  res *= res;

  if(exponent % 2 == 1)

    res *= base;

}

  return res;

}

其中,exponent % 2 ==1 的操作可以简化为 移位+与1运算

剑指offer(5)

原文:https://www.cnblogs.com/cherry-BAIL/p/12953725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!