【算法】数值的整数次方

118 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

题目

实现函数double Power(double base,int exponent),求base的exponent次方。不使用库函数以及不考虑大数问题。

解题思路

在不考虑库函数的情况下自行实现实现方法需要考虑到指数输入值的情况:指数小于1即零和负数以及底数是0的情况。

  1. 当输入值n小于0时实际上就是将指数求绝对值然后算出次方结果后取它的倒数
  2. 对于指数为0情况需要做特殊判断处理结果为1。

迭代快速幂解法

  1. 先考虑底数x和指数n为0情况。
  2. n是奇数则需要exponent乘base值。
  3. base不断相乘求次方。
  4. n值除2不断向0取整。
 if (x == 0) {
    return 0; // 底数0返回0
 }
 if (n == 0) {
    return 1; // 指数0返回1
 }
 double exponent = 1;
 double base = n > 0 ? x : 1 / x; // 指数正负影响是否取倒数
 while (n != 0) { // 循环指数 指数还不为0时
     if (n % 2 != 0) { // 指数余数不为0表示还有数
         exponent *= base; // 
     }
     base *= base; // 指数相乘
     n /= 2; // 指数取一半
 }
 return exponent;

快速幂解法

快速幂需要使用到递归函数来实现。其思想是以它上次次方基础上再平方一次,举例求一个数16次方,若已知它8次方那么在该基础上再平方就能算出结果。同理依次类推在4次方基础上可算出8次方,在8次方求16次方......

  1. N不停除2不断向0取整
  2. N是奇数需要乘x
 public double pow(double x, int n) {
      // 指数是否大于0的判断
     // 当n小于0时需要对n做绝对值处理
     return n >= 0 ? quickMul(x, n) : 1.0 / quickMul(x, -n);
 }

 public double quickMul(double x, long N) {
     // 等于0时直接返回结果是1
     if (N == 0) {
         return 1.0;
     }
     // 求上一个次方的值
     double y = quickMul(x, N / 2);
     // 对数是双数还是单数 单数需要再乘一个x
     return N % 2 == 0 ? y * y : y * y * x;
 }