• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
长发不及肩
博客园    首页    新随笔    联系   管理    订阅  订阅
剑指offer(5)

本期 数值的整数次方

题目 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运算

posted on 2020-05-29 23:19  长发不及肩  阅读(95)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3